建议82:Parallel简化但不等同于Task默认行为
建议81说到了Parallel的使用方法,不知道大家是否注意到文中使用的字眼:在同步状态下简化了Task的使用。也就是说,在运行Parallel中的For、ForEach方法时,调用者线程(在示例中就是主线程)是被阻滞的。Parallel虽然将任务交给Task去处理,即交给CLR线程池去处理,不过调用者会一直等到线程池中的相关工作全部完成。表示并行的静态类Parallel甚至只提供了Invoke方法,而没有同时提供一个BeginInvoke方法,这也从一定程度上说明了这个问题。
在使用Task时,我们最常使用的是Start方法(Task也提供了RunSynchronously),它不会阻滞调用者线程。如下所示:
输出为:
主线程即将结束 |
使用Parallel执行相近的功能,主线程被阻滞:
如果执行这段代码,永远不会有输出。
并行编程,意味着运行时在后台将任务分配到尽量多的CPU上,虽然它在后台使用Task进行管理,但这并不意味着它等同于异步。
相关链接:
连载1 连载2 连载3 连载4 连载5 连载6 连载7 连载8 连载9
连载10 连载11 连载12 连载13 连载14 连载15 连载71 连载72 连载73
连载74 连载75 连载76 连载77 连载78 连载79 连载80 连载81