"await"不会阻塞调用线程。
"await"不会阻塞调用线程。
这个问题已经有了答案:
如何以及何时使用 \'async\' 和 \'await\'
我从来没有一个好的机会深入了解过 async/await
,所以我只有一个大致的了解。
于是我在 WinForms 应用程序中尝试了这样的用法:
private async void button2_Click(object sender, EventArgs e) { // In below line I understand the Task is created and scheduled to execute, which in this // simple case means, that it executes right away asynchronously. var task = Task.Factory.StartNew(() => { Task.Delay(5000).Wait(); return 12; }); // Here we wait for the task to finish, so we don't see MessageBox yet. var res = await task; MessageBox.Show("Result is :" + res); }
我的问题是,既然我们等待 await
,我希望阻塞UI线程,因为我们无法在该线程中继续前进(到具有 MessageBox
的行)。所以UI线程实际上停在了具有事件句柄的方法上。
但是,让我惊讶的是,窗口是响应的,并且一切都非常顺利,但我没想到会这样。有人能解释一下发生了什么吗?
阅读了这篇文章后,我仍然有疑问,如果我的例子中 await
是异步的,而且不会阻塞UI线程,为什么线程不继续到下一行与 MessageBox
吗?UI线程是如何继续的呢?
在 await
之后的代码是否像 ContinueWith
中一样只是另一个 Task
?但它会回到UI上下文吗?
admin 更改状态以发布 2023年5月21日