我仍然不完全理解 async/await 是如何工作的。每个互联网帖子都告诉我一些有关 SynchronizationContext 等的信息,但我仍然不明白它是如何唤醒 UI 线程的。
想象一下,我从 UI 线程使用
await
,控制权将返回那里 (.ConfigureAwait(true)
)。
我的任务将在线程池线程上执行。同时,UI 保持响应,这意味着它处于消息循环中。我很懒,不移动鼠标什么的,所以UI线程被阻塞了
GetMesssage()
。
.NET(SynchronizationContext 或其他)是否会在某个时刻向 UI 线程发送或发布消息以使其被唤醒?如果是这样,那会是哪条消息?
通常,Windows 消息将被分派到函数调用中。 .NET 如何设法调用任意方法(
await
后面的其余代码)?
如果我们谈论 WinForms 及其主线程,那么是的,使用 Windows 消息。
当您在 WinForms 应用程序主线程中捕获
SynchronizationContext
时,上下文将为 WindowsFormsSynchronizationContext
类(https://github.com/dotnet/winforms/blob/da7bb656430a3990534237d1418822688368932c/src/System.Windows.Forms/src /系统/Windows/Forms/WindowsFormsSynchronizationContext.cs#L86)。
在内部,此同步上下文使用
Control.Invoke()
将控制权传递给主线程。
最后,
Control.Invoke
使用PostMessage()
(https://github.com/dotnet/winforms/blob/da7bb656430a3990534237d1418822688368932c/src/System.Windows.Forms/src/System/Windows/Forms/Control.cs #L6923)
注意:这仅对 WinForms 和当前实现有效,将来可能会更改。