45

什么时候应该使用 async/await,什么时候应该在 C# 中使用 parallel.foreach?并行和异步/等待是否具有相同的目的?它们有什么区别?

4

1 回答 1

114

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

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

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

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

您可以通过启动将调用的新任务Parallel.ForEach,然后等待该任务来结合并行性和异步性。(仅作为一个例子。)

于 2012-12-31T09:04:19.837 回答