提问者:小点点

等待不阻止调用线程[重复]


我从来没有很好的机会深入了解,所以我对它的作用有一个大概的了解。

所以我在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);
}

我的问题是,由于我们正在等待,我预计会阻塞UI线程,因为我们可以在该线程中进一步访问(访问

但是,令我惊讶的是,windows的响应能力很强,一切都运行得很好,但我没想到会这样。谁能解释一下这是怎么回事?

读完这篇文章后,我仍然有一个疑问,如果是异步的,并且在我的示例中没有阻塞UI线程,那么为什么线程不使用继续到下一行?那么UI线程是如何进行的呢?

后面的代码只是另一个,就像中的代码,这是个好主意吗?但它又回到UI上下文?


共1个答案

匿名用户

异步方法很像生成器方法。编译器将在每个运算符处拆分您的代码。插入一个代码块以检查任务是否已经完成,在这种情况下,方法立即继续。或者如果任务未完成,则注册一个回调以在以后继续执行,并且您的方法返回。

提前返回是异步方法的全部要点。