在UI线程上使用await和阻塞调用一样吗?

时间:2013-01-23 13:19:05

标签: c# multithreading asynchronous task

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

例如:

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

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

2 个答案:

答案 0 :(得分:5)

没有; await的重点是不是阻止通话 编译器将await之后的代码转换为回调。

只要您正在等待的事情表现良好(意味着它不能同步完成工作),您的用户界面就可以了。

答案 1 :(得分:4)

不,绝对没有。

await的要点是没有阻止。假设PrintTwoMillionTimes的结果表现得很明智,异步方法将立即返回...但是它将附加一个continuation,以便在结果完成时该方法的其余部分将在UI线程上执行。

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

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

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

当然,这只是非常的简要说明。您应该更详细地阅读async / await。 MSDN是一个合理的起点。