C#中如果正确使用线程Task类和Thread类
C#中使用线程Task类和Thread类小结
刚接触C#3个月左右,原先一直使用C++开发,因为公司的需要,所地采用C#开发,主要是控制设备的实时性操作,此为背景。
对于C#中的Task和Thread我在这不作介绍,要了解更多的,如果查看相当信息。此次项目中使用到TASK和THRED,让我调试足足用了将近两周的时间才找出问题所在,所以在此写出来防止跟我一样刚接触C#,又同时需要对线程的实时性要求的开发人员一些个人总结注意事项。
1.Task适合用于多处理器,且i系列多处理器。
2.Thread则适用于所有的处理器,实时性更高。
下面是我的个人测试代码:
其中使用的对错可能是我个人对C#线程理解不够引起的,如果有使用不正确错,望大鸟指导。
private static void ThreadAndTaskTest() { Stopwatch watch = new Stopwatch(); watch.Start(); <p> //Thread threadTest1 = new Thread(() => //{ // Thread.Sleep(2000); // Debug.WriteLine("线程1结束消耗时间:{0}", watch.ElapsedMilliseconds); //}); //threadTest1.Start();</p><p> //Thread threadTest2 = new Thread(() => //{ // Thread.Sleep(2000); // Debug.WriteLine("线程2结束消耗时间:{0}", watch.ElapsedMilliseconds); //}); //threadTest2.Start();</p><p> //Thread threadTest3 = new Thread(() => //{ // Thread.Sleep(2900); // Debug.WriteLine("线程2结束消耗时间:{0}", watch.ElapsedMilliseconds); //}); //threadTest3.Start();</p><p> </p> var Task1 = Task.Factory.StartNew(() => { Thread.Sleep(2500); Debug.WriteLine("线程1结束消耗时间:{0}", watch.ElapsedMilliseconds); }); var Task2 = Task.Factory.StartNew(() => { Thread.Sleep(2700); Debug.WriteLine("线程2结束消耗时间:{0}", watch.ElapsedMilliseconds); }); var Task3 = Task.Factory.StartNew(() => { Thread.Sleep(2900); Debug.WriteLine("线程3结束消耗时间:{0}", watch.ElapsedMilliseconds); }); while (watch.ElapsedMilliseconds <= 3000) { //if (!threadTest.IsAlive && !threadTest1.IsAlive) if (Task1.IsCompleted && Task2.IsCompleted && Task3.IsCompleted) { Debug.WriteLine("监控结束消耗时间:{0}", watch.ElapsedMilliseconds); break; } else Thread.Sleep(1); } }
上面采用Task测试结果如下:
线程1结束消耗时间:2503
线程2结束消耗时间:2703
线程3结束消耗时间:3944(理论应该2905)
同样的代码采用Thread的测试结如下:
线程2结束消耗时间:2003
线程1结束消耗时间:2002
线程2结束消耗时间:2905
上面测试环境在:
处理器:Pentium(R)Dual-Core CPU E6700 @3.20GHXZ
安装内存(RAM):4.0GB
系统类型:32位操作系统
如果采用 i5系列的CPU,其它硬件环境都一样则不会有这种超时情况.
在此也遇到点问题:线程20个以上同时运行,线程的实时性差异也很大,同一个线程函数差距有700ms.
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。