zoukankan      html  css  js  c++  java
  • 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.
  • 相关阅读:
    P3162 [CQOI2012]组装
    P3161 [CQOI2012]模拟工厂
    P3158 [CQOI2011]放棋子
    P3154 [CQOI2009]循环赛
    zabbix部署监控端(server)以及页面优化
    zabbix-agent端自定义监控项(free -m)服务器内存使用率
    java应用系统运行速度慢的解决方法
    at org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmplImpl.renderNoFlush(BackupMasterStatusTm
    解决Hbase启动后,hmaster会在几秒钟后自动关闭(停掉)!!!
    全网最详细的Hadoop HA集群启动后,两个namenode都是standby的解决办法(图文详解)
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5058808.html
Copyright © 2011-2022 走看看