【发布时间】:2015-05-29 10:33:21
【问题描述】:
我正在尝试理解 async/await 并阅读了许多文章,但仍然对同步/异步性质感到困惑。
我有以下测试控制台应用程序:
static void Main(string[] args)
{
var test = FooAsync();
Console.WriteLine("After FooAsync");
for (int i = 0; i < 100; i++)
Console.WriteLine("After that");
Console.ReadKey();
}
private static async Task FooAsync()
{
Console.WriteLine("Before delay");
await Task.Delay(1);
Console.WriteLine("After delay");
}
代码给出的输出如下:
Before delay
After FooAsync
After that
After that
After that
After that
After delay
After that
.
.
我知道 async/await 不会创建一个单独的线程进行处理,并且在FooAsync 到达await Task.Delay(1) 行时,它将返回到Main,因为任务将然而,还没有完成,因为我们只在一个线程上运行,有人可以解释是什么触发了FooAsync 方法在Main 内的某个任意点恢复,然后Main 可以继续吗?
更新 我收回它,i3arnon 和 dariogriffo 是正确的。该代码确实使用了多个线程(正如我之前在调试器中看到的那样,或者按照 kha 的建议做了明显的事情)。我对下一页https://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_Threads 上的线程部分感到困惑,没有意识到“继续”实际上是指“等待”任务完成后立即运行的继续任务计划。
【问题讨论】:
-
i3arnon 的回答是正确的,但如果您想完全理解它,请将您的 FooAsync 替换为:
private static async Task FooAsync() { Console.WriteLine("Before delay on " + Thread.CurrentThread.ManagedThreadId); await Task.Delay(1); Console.WriteLine("After delay on " + Thread.CurrentThread.ManagedThreadId); }并查看之前和之后在单独的线程上完成。
标签: c# .net multithreading asynchronous async-await