是Parallel.ForEach已经过时了.过时了?

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'类过时,旧或不流行?

sta*_*ica 5

我不认为Parallel.ForEach已经过时了.

自从.NET 4引入任务并行库(TPL)以来,微软已经区分了"数据并行"(例如Parallel.ForEach)和"任务并行"(Task).来自MSDN:

  • "数据并行性是指在源集合或数组中的元素上同时(即并行)执行相同操作的场景."
  • "[T] ask parallelism指的是同时运行的一个或多个独立任务."

(由我强调.就像dcastro评论的那样(上图):"你的朋友混淆了与异步的并行性.")

这两种类型的并行/并发性追求不同的目标,因此TPL为每种目标提供不同的功能.

从概念上讲,Task.WhenAll属于任务并行性类别,所以我认为它不会过时属于另一个(数据并行)类别的东西.