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

AUs*_*123 36 asynchronous async-await parallel.foreach

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

Jon*_*eet 93

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

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

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

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

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