async wait 是否使用 Windows 消息将控制权返回给 UI 线程?

问题描述 投票:0回答:1

我仍然不完全理解 async/await 是如何工作的。每个互联网帖子都告诉我一些有关 SynchronizationContext 等的信息,但我仍然不明白它是如何唤醒 UI 线程的。

想象一下,我从 UI 线程使用

await
,控制权将返回那里 (
.ConfigureAwait(true)
)。

我的任务将在线程池线程上执行。同时,UI 保持响应,这意味着它处于消息循环中。我很懒,不移动鼠标什么的,所以UI线程被阻塞了

GetMesssage()

.NET(SynchronizationContext 或其他)是否会在某个时刻向 UI 线程发送或发布消息以使其被唤醒?如果是这样,那会是哪条消息?

通常,Windows 消息将被分派到函数调用中。 .NET 如何设法调用任意方法(

await
后面的其余代码)?

c# multithreading async-await
1个回答
0
投票

如果我们谈论 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 和当前实现有效,将来可能会更改。

© www.soinside.com 2019 - 2024. All rights reserved.