2

只是大声阅读和思考:如果我await在主 UI 线程中调用一个方法,那相当于是一个阻塞调用,对吧,因为没有调用 UI 线程的线程?

例如:

int Main()
{
    // This would be a blocking call, right?
    await PrintTwoMillionTimes("Hello");

    Console.WriteLine("Phew! Done!");
}
4

2 回答 2

5

不; 的全部意义await在于它不是阻塞调用。
编译器将 之后的代码await转换为回调。

只要您正在等待的东西表现良好(这意味着它不会同步完成其工作),您的 UI 就可以了。

于 2013-01-23T13:20:20.670 回答
4

不,绝对不是。

关键await是它不会阻塞。假设结果PrintTwoMillionTimes合理,异步方法将立即返回......但它会附加一个延续,以便在结果完成时(在 UI 线程上)执行该方法的其余部分。

因此,假设您有一个工作示例(当前您的方法声明不是async,并且返回int,并且您没有任何return语句......)流程是:

  • 异步方法开始
  • PrintTwoMillionTimes被调用,它将启动一个异步操作,返回代表操作的东西(例如 a Task
  • 生成的代码将检查操作是否已经完成:
    • 如果已经完成,则继续执行
    • 否则,将延续附加到任务(或表示操作的任何内容)并且异步方法返回

如果您从异步方法返回TaskTask<T>从异步方法返回,则返回值可用于指示异步方法本身何时完成(即在您Console.WriteLine执行之后)。

当然,这只是一个非常简短的描述。你真的应该更详细地阅读 async/await 。MSDN是一个合理的起点。

于 2013-01-23T13:21:21.103 回答