C# 线程的理解

 这是线程创建和开始的简单格式。一下两个方式一样。

(new Thread(new ThreadStart(downloadThread))).Start();//开启下载线程

Thread thread1 = new Thread(downloadThread);
                thread1.Start();

如果要用到线程的传参。

Thread thread1 = new Thread(new ParameterizedThreadStart(runOnlineThread));
                thread1.Start(CB_Circle.IsChecked);

 

接下来我们要来了解一下TaskFactory(任务工厂):

  1.需要创建一组Task对象来共享相同的状态

  2.为了避免机械的将相同的参数传给每一个Task的构造器。

Task.Factory.StartNew(() => selectActionItemRun(i),
                new CancellationTokenSource().Token, TaskCreationOptions.None, _syncContextTaskScheduler).Wait();
                Thread.Sleep(m_ServoActions[i].servoTime);

 第一个参数() => selectActionItemRun(i)表示要执行的函数,这里用的是Lamada表达式。

第二个参数new CancellationTokenSource().Token表示

WaitAny方法会阻塞调用线程,知道数组中的任何一个Task对象完成,这个方法会返回一个索引值,指明完成的是哪一个Task对象。如果发生超时,方法将返回-1。它可以通过一个CancellationToken取消,会抛出一个OperationCanceledException。

第三个参数TaskCreationOptions这个类型是一个枚举类型,传递一些标志来控制Task的执行方式。

C# 线程的理解

 第四个参数表示TaskScheduler.FromCurrentSynchronizationContext(),表示

TaskScheduler有两个派生类:thread pool task scheduler(线程池任务调度),和synchronization context task scheduler(同步上下文任务调度器)。默认情况下,所以应用程序使用的都是线程池任务调度器,这个任务调度器将任务调度给线程池的工作者线程。可以查询TaskScheduler的静态Default属性来获得对默认任务调度器的一个引用。

  同步上下文任务调度器通常用于桌面应用程序,Winfrom,WPF及Silverlight。这个任务调度器将多余任务都调度给应用程序的GUI线程,使所有任务代码都能成功更新UI组建,比如按钮、菜单项等。同步上下文任务调度器根本不使用线程池。同样,可以查询TaskScheduler的静态FromCurrentSynchronizationContext方法来获得对一个同步上下文任务调度器的引用。

在一个线程调用Wait方法时,系统会检查线程要等待的Task是否已经开始执行,如果任务正在执行,那么这个Wait方法会使线程阻塞,直到Task运行结束为止。

创建任务并不一定创建线程,但是会将任务分配给线程,除非线程不够用才会创建新的线程。

参考https://www.cnblogs.com/x-xk/archive/2012/12/11/2804563.html