【发布时间】:2020-12-17 21:37:17
【问题描述】:
我读过 C# 中的异步编程,但我仍然不完全理解如何执行 async 方法的延续。 据我了解,异步编程与多线程无关。我们可以在 UI 线程上运行异步方法,然后它会在该 UI 线程上继续运行(同时不会阻塞并继续响应来自消息循环的其他消息)。
这是大多数 GUI 应用程序具有的基本消息循环:
while (1)
{
bRet = GetMessage(&msg, NULL, 0, 0);
if (bRet > 0) // (bRet > 0 indicates a message that must be processed.)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
...
DispatchMessage() 调用 UI 事件处理程序。并且事件处理程序中的代码不应阻塞主线程。出于这个原因,如果我们想要,即创建一个从磁盘加载大量数据的按钮,我们可以使用这样的异步方法:(简化伪代码)
public async Task ButtonClicked()
{
loadingBar.Show();
await AsyncLoadData();
loadingBar.Hide();
}
当执行到达await AsyncLoadData(); 行时,它会存储上下文并返回Task 对象。 DispatchMessage() 结束,消息循环反复到达bRet = GetMessage(&msg, NULL, 0, 0); 行。
所以我的问题是,其余代码是如何执行的?完成异步操作是否触发了一条新消息,然后由DispatchMessage() 再次处理?或者消息循环有另一个方法(在调度之后),检查完成的异步操作?
【问题讨论】:
-
你可能会觉得这很有趣:Dissecting the async methods in C#
标签: c# asynchronous async-await