Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 是平行的。ForEach过时了。旧的,过时的?_Multithreading_Design Patterns_Parallel Processing_Async Await_.net 4.5 - Fatal编程技术网

Multithreading 是平行的。ForEach过时了。旧的,过时的?

Multithreading 是平行的。ForEach过时了。旧的,过时的?,multithreading,design-patterns,parallel-processing,async-await,.net-4.5,Multithreading,Design Patterns,Parallel Processing,Async Await,.net 4.5,你好 并行执行可以通过多种方式实现。从严格的手动“多线程”到使用微软创建的各种“助手”。其中一个助手是并行类 我的一位同事坚持认为,Parallel.ForEach(或整个平行类)是“旧”的,不应该使用。相反,他说,应该使用异步操作。换句话说,您应该使用Task.WhenAll()而不是Parallel.ForEach() 当被问及为什么不使用Parallel.ForEach(),当这正是需要的时候-并行执行多个昂贵的操作时,他回答说Parallel.ForEach()很旧,微软建议尽可能使用异

你好

并行执行可以通过多种方式实现。从严格的手动“多线程”到使用微软创建的各种“助手”。其中一个助手是并行类

我的一位同事坚持认为,Parallel.ForEach(或整个平行类)是“旧”的,不应该使用。相反,他说,应该使用异步操作。换句话说,您应该使用
Task.WhenAll()
而不是
Parallel.ForEach()

当被问及为什么不使用
Parallel.ForEach(),
当这正是需要的时候-并行执行多个昂贵的操作时,他回答说
Parallel.ForEach()
很旧,微软建议尽可能使用异步/等待

我搜索了整个MSDN和Stackoverflow以及所有我能找到的地方,但没有找到任何指向使用async/await而不是.Parallel的必要性的东西。虽然通过交换这些工具通常可以获得类似的结果,但这并不意味着Parallel.ForEach已经过时。还是这样

任何人都可以链接到某个声誉良好的机构(MSDN?)的一些“最佳实践”或“建议”,即
Parallel.ForEach()
正在被淘汰,需要坚持创建、运行和等待任务吗

请不要发布与并行与异步相关的答案,因为这不是问题所在


问题是:既然可以在所有的时候使用async/wait
使任务并行运行(
WaitAll
等等),那么它是否会使“并行”类在.NET 4.5以后的版本中过时、过时或不流行

我不认为
并行。ForEach
已经过时了

自从在.NET4中引入任务并行库(TPL)以来,微软一直在努力。从MSDN:

  • “数据并行性是指对源集合或数组中的元素同时执行相同操作(即并行执行相同操作)。”
  • “[T]任务并行性是指一个或多个独立任务同时运行。”

(我强调了一下,比如:“你的朋友把并行和异步混淆了。”)

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


从概念上讲,
Task.whalll
属于任务并行类别,因此我不认为它会淘汰属于其他(数据并行)类别的东西。

Parallel.ForEach
(以及PLINQ作为一个整体)具有在
异步
语言支持中不可用的功能

例如,您可以限制并行度(例如,要处理100个项目,但一次不能超过10个)。因此,它不是过时的

从根本上讲,
async
是使并发操作更易于编写,而不需要任何线程假设。PLINQ是关于利用多核进行计算的


我怀疑您的同事对任务并行库(TPL)的直接使用读得太多了,在语言中使用
async
基本上是不必要的(除了
async
函数的返回类型)。但PLINQ始终是TPL的另一层。如果有什么不同的话,PLINQ和
async
是将第三方物流用于不同目的的两种不同方式。

async
wait
与并行性毫无关系。它们是用于使现有异步API更易于使用和公开的技术<代码>异步
等待
不会启动并行或并发。实际上,
wait
通过等待已经运行的东西来结束并行性


Parallel.ForEach
用于在多个核上以相同的方式处理一组同质项。您可以通过生成大量任务来模拟Parallel.ForEach
。那样做没有好处。事实上,它引入了低效率并混淆了代码。这是可能的,也有效,但如果
Parallel.ForEach
适用,则这是一种较差的做事方式

我想你的同事不明白等待真的只是等待。它不会开始什么


使用Parallel.*和PLINQ(大部分)进行CPU受限的工作。

如果他声称“Microsoft推荐”,那么他应该能够展示该推荐。我自己也没见过这样的事情。你的朋友把并行和异步搞混了。@JonSkeet你看,在我真正做研究之前,我不想要求他证明,因为我不想表现出敌意。如果你(或其他人)的回答是“当然,每个人都知道它已经过时了——我们只为老年人保留它”@Alexeifime:我想你可以用一种非敌意的方式问,这样做是完全合理的。@JonSkeet最终我会问的。现在在你的帮助下,我正在准备对话。做好准备总是更好的。谢谢。在我的例子中,我调用多个对不同来源的外部调用。这些电话彼此完全独立。然而,在所有这些都完成之前,我无法继续。并行的ForEach和Task都可以在这里正常工作。然而,我发现ParallelForEach更优雅,涉及的代码更少。他认为是的,也许使用它并不一定是错误的,但首选的方法是Task.WhenAll()@AlexeiFimine:关于意见分歧的一些一般建议:问问你的同事为什么他声称
Task.WhenAll
是首选方法。虽然在这种情况下往往没有明确的对与错,但人们应该能够理性地支持自己的主张。(请参阅)如果他的论点说服了您(即它们比您当前的观点“更好”),请更改您的代码。如果你认为你有更好的论点(“更多的e