【问题标题】:Async/await and parallel in C# [closed]C# 中的异步/等待和并行 [关闭]
【发布时间】:2012-12-15 11:46:00
【问题描述】:
什么时候应该使用 async/await,什么时候应该在 C# 中使用 parallel.foreach?并行和异步/等待是否具有相同的目的?
它们有什么区别?
【问题讨论】:
标签:
asynchronous
async-await
parallel.foreach
【解决方案1】:
async/await 是关于异步,而Parallel.ForEach 是关于并行。它们是相关的概念,但并不相同。
Parallel.ForEach 用于当您想对集合中的所有项目并行执行相同的操作,阻塞当前线程直到所有操作完成。
async/await 用于当前操作在特定异步操作完成之前无法取得更多进展,但您不想阻塞当前线程。这在两种情况下特别有用:
- 编写基本上启动各种异步操作的代码,一个接一个地,在 UI 线程上,在操作之间短暂访问 UI。 (它比这更通用,但这是一个简单的示例。)您不想阻塞 UI 线程,但管理所有这些异步操作是一件很痛苦的事情。
- 一次处理很多个长时间运行的操作 - 例如在网络服务器中。由于调用其他 Web 服务、数据库等,每个单独的请求可能需要很长时间 - 但您不希望每个请求有一个线程,因为线程是一种相对昂贵的资源。
您可以通过启动一个名为Parallel.ForEach 的新任务,然后等待该任务来结合并行性和异步性。 (仅举一个例子。)