只是大声阅读和思考:如果我await
在主 UI 线程中调用一个方法,那相当于是一个阻塞调用,对吧,因为没有调用 UI 线程的线程?
例如:
int Main()
{
// This would be a blocking call, right?
await PrintTwoMillionTimes("Hello");
Console.WriteLine("Phew! Done!");
}
只是大声阅读和思考:如果我await
在主 UI 线程中调用一个方法,那相当于是一个阻塞调用,对吧,因为没有调用 UI 线程的线程?
例如:
int Main()
{
// This would be a blocking call, right?
await PrintTwoMillionTimes("Hello");
Console.WriteLine("Phew! Done!");
}
不; 的全部意义await
在于它不是阻塞调用。
编译器将 之后的代码await
转换为回调。
只要您正在等待的东西表现良好(这意味着它不会同步完成其工作),您的 UI 就可以了。
不,绝对不是。
关键await
是它不会阻塞。假设结果PrintTwoMillionTimes
合理,异步方法将立即返回......但它会附加一个延续,以便在结果完成时(在 UI 线程上)执行该方法的其余部分。
因此,假设您有一个工作示例(当前您的方法声明不是async
,并且返回int
,并且您没有任何return
语句......)流程是:
PrintTwoMillionTimes
被调用,它将启动一个异步操作,返回代表操作的东西(例如 a Task
)如果您从异步方法返回Task
或Task<T>
从异步方法返回,则返回值可用于指示异步方法本身何时完成(即在您Console.WriteLine
执行之后)。
当然,这只是一个非常简短的描述。你真的应该更详细地阅读 async/await 。MSDN是一个合理的起点。