C#async / await - UI线程与其他线程

时间:2017-03-07 16:43:23

标签: c# multithreading asynchronous async-await

我想象的是,如果我编写像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线程中等待同步?

0 个答案:

没有答案