C# 中的异步/等待和并行 [关闭]

Posted

技术标签:

【中文标题】C# 中的异步/等待和并行 [关闭]【英文标题】:Async/await and parallel in C# [closed] 【发布时间】:2012-12-15 11:46:00 【问题描述】:

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

【问题讨论】:

查看相关问题:***.com/questions/9898441/… 看看如何并行调用异步操作***.com/questions/11564506/… 这怎么没有建设性? 【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于C# 中的异步/等待和并行 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用异步/等待 - C# [关闭]

异步等待和并行

Swift 中的 C# 异步等待

C# 理解阻塞 UI 和异步/等待与 Task.Run 的问题?

C# 中的 C++ std::async 与异步/等待

Node.js 与 .net 中的异步/等待