【发布时间】:2018-12-10 13:18:20
【问题描述】:
我正在学习 async/await ,对 MSDN 的 await 解释感到困惑:"await 运算符暂停执行,直到 GetByteArrayAsync 方法的工作完成。在同时,控制权返回给 GetPageSizeAsync 的调用者"
我不明白的是,“返回”是什么意思?起初,我相信当一个线程(比如说UI线程)到达“await”关键字时,系统会创建一个新线程(或从threadPool中获取一个线程)来执行剩下的代码,UI线程可以返回调用者方法并执行其余部分。
但现在我知道“等待”永远不会创建线程。
我写了一个演示:
class Program
{
static void Main(string[] args)
{
new Test().M1();
Console.WriteLine("STEP:8");
Console.Read();
}
}
class Test
{
public async void M1()
{
Console.WriteLine("STEP:1");
var t = M2();
Console.WriteLine("STEP:3");
await t;
}
public async Task<string> M2()
{
Console.WriteLine("STEP:2");
string rs = await M3();//when the thread reaches here,why don't it return to M1 and execute the STEP:3 ??
Console.WriteLine("STEP:7");
return rs;
}
public async Task<string> M3()
{
Console.WriteLine("STEP:4");
var rs = Task.Run<string>(() => {
Thread.Sleep(3000);//simulate some work that takes 3 seconds
Console.WriteLine("STEP:6");
return "foo";
});
Console.WriteLine("STEP:5");
return await rs;
}
}
这个演示打印了一些代表执行流程的标签,我认为它会是
步骤:1
步骤:2
步骤:3
步骤:4
步骤:5
步骤:6
步骤:7
步骤:8
(从 1 到 8 的顺序),
但实际结果是: Figure 1
步骤:1
步骤:2
步骤:4
步骤:5
步骤:3
步骤:8
步骤:6
步骤:7
如果像 MSDN 的解释一样,控制权返回到 M1 并打印“STEP 3”,我绝对错了,那么到底发生了什么?
提前致谢
【问题讨论】:
-
要清楚 -
async"just" 改变了您可以在方法中写入的内容。await不会开始任何事情发生。你总是向await传递一些代表已经开始的工作的东西。开始工作的方式和原因不是await关心的问题。 -
我已经发布了相当长的答案,而且相当罗嗦。但是,我觉得有必要解决您的问题和困惑。如果您发现它有问题,请告诉我。我可能很快就会回来并添加进一步阅读的链接。
标签: c# async-await