我想象的是,如果我编写像this这样的代码:
private async void button1_Click(object sender, EventArgs e)
{
this.button1.Enabled = false;
var someTask = Task<int>.Factory.StartNew(() => slowFunc(1, 2));
save_context_including_someTask();
when_someTask_completes(post_message_into_queue(run_afterStuff()));
}
private void afterStuff()
{
restore_context_including_someTask();
this.label1.Text = "Result: " + someTask.Result.ToString();
this.button1.Enabled = true;
}
编译器实际上是这样做的:
{{1}}
所以它使用(通常是隐藏的)消息队列以同步方式执行“await”之后的代码(它不会中断我在UI线程上已经在做的任何事情)。是
但是async / await的实现必须完全不同,如果我在主UI空间之外的一个线程中运行它们,那里没有消息队列。
由于编译器没有任何方法可以知道我的非UI线程中的“下一件事”是什么,当它命中“await”时它必须......停止并等待?
要缩短一个长问题,是否在非UI线程中等待同步?