【发布时间】:2015-10-20 17:26:13
【问题描述】:
我实际上正在阅读一些关于任务并行库以及使用 async 和 await 进行异步编程的主题。 《C# 5.0 in a Nutshell》一书指出,当使用 await 关键字等待表达式时,编译器会将代码转换为如下内容:
var awaiter = expression.GetAwaiter();
awaiter.OnCompleted (() =>
{
var result = awaiter.GetResult();
假设,我们有这个异步函数(也来自参考书):
async Task DisplayPrimeCounts()
{
for (int i = 0; i < 10; i++)
Console.WriteLine (await GetPrimesCountAsync (i*1000000 + 2, 1000000) +
" primes between " + (i*1000000) + " and " + ((i+1)*1000000-1));
Console.WriteLine ("Done!");
}
“GetPrimesCountAsync”方法的调用将被排入队列并在池线程上执行。通常,从 for 循环中调用多个线程可能会引入竞争条件。
那么 CLR 如何确保请求将按照它们发出的顺序进行处理?我怀疑编译器只是将代码转换为上述方式,因为这会将“GetPrimesCountAsync”方法与 for 循环分离。
【问题讨论】:
-
它创建了一个状态机。此外,该代码不会并行运行,它只会在等待每个对
GetPrimesCountAsync的调用按顺序完成时释放线程。
标签: c# multithreading asynchronous async-await task-parallel-library