"await"不会阻塞调用线程。

14 浏览
0 Comments

"await"不会阻塞调用线程。

这个问题已经有了答案

如何以及何时使用 \'async\' 和 \'await\'

yield 和 await 如何在 .NET 中实现控制流?

.Net 4.5 中 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日
0
0 Comments

异步方法非常像生成器方法。编译器会在每个await运算符处分割你的代码。如果任务已经完成,则插入一段代码块进行检查,此时方法将立即继续执行。或者如果任务尚未完成,则注册回调以稍后继续执行,并且您的方法会返回。

早期返回是异步方法的全部意义。

0