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

时间:2012-12-31 08:53:30

标签: asynchronous async-await parallel.foreach

我应该何时使用async / await,何时应该在C#中使用parallel.foreach?并行和异步/等待是否有同样的目的? 它们有什么不同?

1 个答案:

答案 0 :(得分:88)

async / await是关于异步,而Parallel.ForEach是关于 parallelism 。它们是相关的概念,但不一样。

如果要对集合中的所有项执行相同的操作,并且阻塞当前线程直到所有操作都已完成,则使用

Parallel.ForEach

async / await用于当前操作在特定异步操作完成之前不能再进行任何操作,但您不想阻止当前线程时。这在两种情况下特别有用:

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

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

相关问题