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.

时间: 2024-10-14 00:38:52

C#中如果正确使用线程Task类和Thread类的相关文章

C#的线程类之Thread类以及对为什么设置线程优先级却不先执行这一问题本身的认识

1.C#对线程进行操作时,通过Thread类,可以对线程进行创建.挂起.恢复.休眠.终止及设置优先级. Thread类位于System.Threading命名空间下,该命名空间还包含一个ThreadPool类(允许用户使用系统提供的线程池)和一个Timer类(在线程池上执行回调方法) 在线程运行期间,不同的时刻会表现为不同的状态,但它总是处于由ThreadState定义的一个或多个状态中.用户可以通过使用ThreadPriority枚举为线程定义优先级,但不能保证操系统会接收该优先级 2.Thr

如何创建线程第一种继承Thread类

步骤 1:定义一个类 继承Thread类.2:重写Thread类的run方法.3:直接创建Thread的子类对象创建线程.4:调用start方法开启线程并调用线程的任务run方法执行.----------------------------------------------- package TestException; public class test1 { public static void main(String[] args) { // 3:直接创建Thread的子类对象创建线程.

Java知多少(58)线程Runnable接口和Thread类详解

大多数情况,通过实例化一个Thread对象来创建一个线程.Java定义了两种方式: 实现Runnable 接口: 可以继承Thread类. 下面的两小节依次介绍了每一种方式. 实现Runnable接口 创建线程的最简单的方法就是创建一个实现Runnable 接口的类.Runnable抽象了一个执行代码单元.你可以通过实现Runnable接口的方法创建每一个对象的线程.为实现Runnable 接口,一个类仅需实现一个run()的简单方法,该方法声明如下:    public void run( )

Java 线程--继承java.lang.Thread类实现线程

现实生活中的很多事情是同时进行的,Java中为了模拟这种状态,引入了线程机制.先来看线程的基本概念. 线程是指进程中的一个执行场景,也就是执行流程,进程和线程的区别: 1.每个进程是一个应用程序,都有独立的内存空间. 2.同一个进程中的线程共享其进程中的内存和资源. (共享的内存是堆内存和方法区内存,栈内存不共享,每个线程有自己的栈内存) 我们还需要了解以下基本内容: 1.什么是进程? 一个进程对应一个应用程序.例如:在Windows操作系统启动word就表示启动了一个进程.在Java开发环境下

communication between threads 线程间通信 Programming Concurrent Activities 程序设计中的并发活动 Ada task 任务 Java thread 线程

Computer Science An Overview _J. Glenn Brookshear _11th Edition activation 激活 parallel processing 并行处理 concurrent processing 并发处理 Each programming language tends to approach the parallel processing paradigm from its own point of view, resulting in di

Java多线程01(Thread类、线程创建、线程池)

Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程.一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序. 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 1.1.2 单线程程序 - 从入口m

C#线程系列讲座(2):Thread类的应用

一.             Thread类的基本用法 通过System.Threading.Thread类可以开始新的线程,并在线程堆栈中运行静态或实例方法.可以通过Thread类的的构造方法传递一个无参数,并且不返回值(返回void)的委托(ThreadStart),这个委托的定义如下: [ComVisibleAttribute(true)] public delegate void ThreadStart() 我们可以通过如下的方法来建立并运行一个线程. Code highlighting

PYTHON——多线程:Thread类与线程对象

Thread类与线程对象 Thread类构造方法的target关键字参数不仅可以是函数,还可以是一个对象,可以称这个对象为线程对象.其实,线程调用的仍然是函数,只是这个函数用对象进行了封装.这么做的好处是可以将线程函数相关的代码都放在这个对象对应的类中,更能体现面向对象的封装性. 线程对象对应的类需要有一个可以传入线程函数和参数的构造方法,而且在类中还必须有一个名为"__call__()"的方法.当线程启动时,会自动调用线程对象的"__call__()"方法,然后在

几种创建线程方式Thread类和Runnable接口

对于很多想学习java的人来说,经常听别人说线程难,其实真正理解了线程后,一点都不会觉得线程难,这里我为大家梳理下线程的创建方式吧. 一.线程的创建方式有三种 1.继承Thread类 2.实现Runnable接口 3.实现Callable接口(返回结果并且可能抛出异常的任务). 如果采用实现Callable接口接口的方式,返回结果并且可能抛出异常的任务,不利于开发,这里就不给大家介绍了.这里咋们主要说说采用继承Thread类和实现Runnable接口的方式来创建线程. 1.继承Thread类的方