agf*_*gfc 5 parallel-processing multithreading design-patterns async-await .net-4.5
美好的一天,
可以通过多种方式实现并行执行.从严格的手动"多线程"到使用Microsoft创建的各种"帮助者".其中一个帮手是Parallel类.
我的一位同事坚持认为Parallel.ForEach(或整体的Parallel类)是"旧的",不应该使用.相反,他说,应该使用异步操作.换句话说,你应该使用Task.WhenAll()而不是Parallel.ForEach().
当被问及为什么不使用Parallel.ForEach(),时,这正是所需要的 - 并行执行多个昂贵的操作,他回答说这Parallel.ForEach()是旧的,并且Microsoft建议尽可能使用async/await.
我搜遍了MSDN和Stackoverflow以及我能找到的所有地方,但我找不到任何指向使用async/await而不是.Parallel的必要性.虽然通常可以通过交换这些工具来获得类似的结果,但这并不意味着Parallel.ForEach已经过时了.或者是吗?
任何人都有一个信誉良好的机构(MSDN?)的一些"最佳实践"或"建议"的链接,可以说这Parallel.ForEach()是逐步淘汰的,而且需要坚持创建,运行和等待任务?
请不要发布与Parallel VS Async相关的答案,因为这不是问题.
问题是:既然你可以使用async/await WhenAll(WaitAll等)使任务并行运行,那么在.NET 4.5以后它是否会使'Parallel'类过时,旧或不流行?
我不认为Parallel.ForEach已经过时了.
自从.NET 4引入任务并行库(TPL)以来,微软已经区分了"数据并行"(例如Parallel.ForEach)和"任务并行"(Task).来自MSDN:
- "数据并行性是指在源集合或数组中的元素上同时(即并行)执行相同操作的场景."
- "[T] ask parallelism指的是同时运行的一个或多个独立任务."
(由我强调.就像dcastro评论的那样(上图):"你的朋友混淆了与异步的并行性.")
这两种类型的并行/并发性追求不同的目标,因此TPL为每种目标提供不同的功能.
从概念上讲,Task.WhenAll属于任务并行性类别,所以我认为它不会过时属于另一个(数据并行)类别的东西.
| 归档时间: |
|
| 查看次数: |
282 次 |
| 最近记录: |