C#中的异步/等待和并行处理

51

我何时应该在C#中使用async/await,何时应该使用Parallel.ForEach?并行和async/await是否具有相同的用途?它们之间有什么区别?


请参考以下相关问题:https://dev59.com/g2kw5IYBdhLWcg3wbqAS - Stephen Cleary
了解如何并行调用异步操作 https://dev59.com/aWgu5IYBdhLWcg3wHjl7#11565531 - Michael Freidgeim
10
这个问题怎么不够建设性? - oneManArmin
1个回答

121

async/await与异步有关,而Parallel.ForEach并行有关。它们是相关的概念,但并不相同。

当您希望对集合中的所有项目执行相同操作,以并行方式阻塞当前线程直到所有操作完成时,使用Parallel.ForEach

当当前操作在特定异步操作完成之前无法取得更多进展但又不想阻塞当前线程时,使用async/await。这在以下两种情况下特别有用:

  • 编写基本上在UI线程上依次启动各种异步操作的代码,在操作之间短暂访问UI。(它比那更通用,但那是一个简单的例子。) 您不希望阻塞UI线程,但管理所有这些异步操作否则很麻烦。
  • 同时处理大量长时间运行的操作-例如在Web服务器中。每个单独的请求可能需要很长时间,因为要调用其他Web服务、数据库等-但您不想每个请求有一个线程,因为线程是相对昂贵的资源。

您可以通过启动一个新任务来组合并行和异步,该任务将调用Parallel.ForEach,然后等待该任务。 (只是举个例子。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接