菜鸟学习并行编程,参考《C#并行编程高级教程.PDF》,如有错误,欢迎斧正。
网址:https://www.cnblogs.com/woxpp/p/3928788.html
目录任务简介
TPL引入新的基于任务的编程模型,通过这种编程模型可以阐扬多核的功能,提升应用措施的性能,不需要编写底层庞大且重量级的线程代码。
但需要注意:任务并不是线程(任务运行的时候需要使用线程,但并不是说任务代替了线程,任务代码是使用底层的线程(软件线程,调理在特定的硬件线程或逻辑内核上)运行的,任务与线程之间并没有一对一的关系。)
创建一个新的任务时,调理器(调理器依赖于底层的线程池引擎)会使用事情窃取行列队伍找到一个最合适的线程,然后将任务插手行列队伍,任务所包罗的代码会在一个线程中运行。如图:
System.Threading.Tasks.Task
一个Task暗示一个异步操纵,Task供给了很多要领和属性,通过这些要领和属性能够对Task的执行进行控制,并且能够获得其状态信息。
Task的创建和执行都是独立的,因此可以对关联操纵的执行拥有完全的控制权。
使用Parallel.For、Parallel.ForEach的循环迭代的并行执行,TPL会在后台创建System.Threading.Tasks.Task的实例。
使用Parallel.Invoke时,TPL也会创建与挪用的委托数目一致的System.Threading.Tasks.Task的实例。
注意项
措施中添加很多异步的操纵作为Task实例加载的时候,为了丰裕操作运行时所有可用的逻辑内核,,任务调理器会测验考试的并行的运行这些任务,也会测验考试在所有的可用内核上对事情进行负载均衡。
但在实际的编码过程傍边,并不是所有的代码片段都能够便利的用任务来运行,因为任务会带来特别的开销,尽管这种开销比添加线程所带来的开销要小,但是仍然需要将这个开销考虑在内。
Task状态与生命周期
一个Task实例只会完成其生命周期一次,当Task达到它的3种肯呢过的最终状态之一是,就无法回到之前的任何状态
下面贴代码,详解见注释,便利大家理解Task的状态:
View Code
使用任务来对代码进行并行化
使用Parallel.Invoke可以并行加载多个要领,使用Task实例也能完成同样的事情,下面贴代码:
View Code
期待任务完成Task.WaitAll
Task.WaitAll 要领,这个要领是同步执行的,在Task作为参数被接受,所有Task结束其执行前,主线程不会继续执行下一条指令,下面贴代码
View Code
Task.WaitAll 限定期待时长
View Code
如图10毫秒没有完成任务,则输出了****
通过打消符号打消任务
通过打消符号来中断Task实例的执行。 CancellationTokenSource,CancellationToken下的IsCanceled属性标识表记标帜当前是否已经被打消,打消任务,任务也不必然会顿时打消,下面贴代码:
View Code
Task异常措置惩罚惩罚 当很多任务并行运行的时候,可能会并行产生很多异常。Task实例能够措置惩罚惩罚一组一组的异常,这些异常有System.AggregateException类措置惩罚惩罚
View Code
Task返回值 Task<TResult>
View Code
通过延续串联多个任务
ContinueWith:创建一个方针Task完成时,异步执行的延续措施,await,如代码所示:
View Code
TaskContinuationOptions
TaskContinuationOptions参数,可以控制延续另一个任的任务调理和执行的可选行为。下面看代码:
View Code
TaskContinuationOptions 属性有很多,如下所示