c# - 新的 C# 5.0 'async' 和 'await' 关键字是否使用多核?

标签 c# asynchronous parallel-processing multicore c#-5.0

添加到 C# 5.0 语言的两个新关键字是 asyncawait ,两者协同工作以异步运行 C# 方法而不阻塞调用线程。

我的问题是,这些方法是否真的利用了多核并并行运行,或者异步方法是否与调用方在同一个线程核心中运行?

最佳答案

Two new keywords added to the C# 5.0 language are async and await, both of which work hand in hand to run a C# method asynchronously without blocking the calling thread.

这理解了该功能的目的,但它给了 async/await 功能太多的“功劳”。

让我非常非常清楚这一点:await 不会神奇地导致同步方法异步运行。它不会启动新线程并运行例如,新线程上的方法。您调用的方法必须是知道如何异步运行的方法。它如何选择这样做是它的事。

My question is, do these methods actually take advantage of multiple cores and run in parallel or does the async method run in the same thread core as the caller?

同样,这完全取决于您调用的方法await 所做的只是指示编译器将该方法重写为一个委托(delegate),该委托(delegate)可以作为异步任务的延续进行传递。也就是说,await FooAsync() 的意思是“调用 FooAsync(),无论返回什么,都必须代表刚刚启动的异步操作。告诉那个东西,当它知道异步操作已经完成,它应该调用这个委托(delegate)。”委托(delegate)具有这样的属性,即当它被调用时,当前方法似乎从“它停止的地方”恢复。

如果您调用的调度方法在另一个关联到另一个核心的线程上工作,那就太好了。如果它启动一个计时器,将来在 UI 线程上对某个事件处理程序执行 ping 操作,那就太好了。 await 不关心。它所做的只是确保当异步作业完成时,控制可以从中断处恢复。

一个你没有问但可能应该问的问题是:

When the asynchronous task is finished and control picks up where it left off, is execution in the same thread as it was before?

这取决于上下文。在等待来自 UI 线程的某些内容的 winforms 应用程序中,控件会在 UI 线程上再次拾取。在控制台应用程序中,可能不是。

关于c# - 新的 C# 5.0 'async' 和 'await' 关键字是否使用多核?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9898441/

相关文章:

c# - 任意长度字符串的基数排序

asynchronous - 同步读/写端口时避免递归?

selenium - 使用 Docker、Selenium 和 Pytest 运行并行测试

java - 如何使用java并行流代替executorThreadsPool?

c# - .Net 云存储解决方案

c# - 为什么我的 C# 变量在 Jquery 中返回 null?

javascript - 使用await关键字来模拟同步编程

Python独立运行多个后台循环

python - 并行 Python : Passing a function written in another module to 'submit'

c# - .net Framework 4.0 中地理 sql server 数据类型的 C# 等价物是什么?