只是阅读和思考:如果我在主UI线程中调用方法时使用await
,那就等于是一个阻塞调用,对,因为没有调用UI线程的线程?
例如:
int Main()
{
// This would be a blocking call, right?
await PrintTwoMillionTimes("Hello");
Console.WriteLine("Phew! Done!");
}
答案 0 :(得分:5)
没有; await
的重点是不是阻止通话
编译器将await
之后的代码转换为回调。
只要您正在等待的事情表现良好(意味着它不能同步完成工作),您的用户界面就可以了。
答案 1 :(得分:4)
不,绝对没有。
await
的要点是没有阻止。假设PrintTwoMillionTimes
的结果表现得很明智,异步方法将立即返回...但是它将附加一个continuation,以便在结果完成时该方法的其余部分将在UI线程上执行。
假设您有一个有效的示例(目前您的方法声明不是async
,并且返回int
,并且您没有任何return
语句...... )流程是:
PrintTwoMillionTimes
被调用,它将启动异步操作,返回表示操作的内容(例如Task
)如果您从异步方法返回Task
或Task<T>
,则返回值可用于指示异步方法本身何时完成(即在Console.WriteLine
执行后)。
当然,这只是非常的简要说明。您应该更详细地阅读async / await。 MSDN是一个合理的起点。