相当于 Windows API PostMessage to self for WPF/XAML 应用
本文关键字:WPF XAML 应用 for self Windows API PostMessage to 相当于 | 更新日期: 2023-09-27 18:17:34
在Windows应用程序开发的"旧时代",使用PostMessage Windows API函数将消息发布到您自己的应用程序是将特定任务的处理移出当前堆栈上下文的好方法,同时保留在主线程上,从而避免尝试在另一个线程上执行主线程任务的细微差别(这当然会导致使用Invoke样式方法来移动处理回到主线程等(
您所要做的就是:
- 创建数值大于 WM_USER 的自定义窗口消息
- 使用PostMessage将该消息广播给您自己
- 将处理程序添加到主对话框窗口,以处理自定义 WM_* 消息的消息并对其执行操作
移出,例如在深度嵌套的调用堆栈中,可能使用保留资源锁等的方法,而是将处理延迟到"更干净"的执行上下文。
例如,我真的不喜欢在属性 setter/getter 中做太多事情,尤其是对于依赖项属性,除了保存或恢复值。 该和事件处理程序是执行上下文的两个主要示例,我想延迟与特定事件关联的任务并将其传递回主线程,以便在主线程执行上下文的顶层执行。
我想对我的 WPF/XAML 应用执行相同的操作,但我只想使用托管代码,因此如果可能的话,我不想使用 Windows API 调用,因此我试图避免在以下两篇 SO 帖子中执行类似操作:
如何创建 C# 事件来处理来自 PostMessage(( 的 MFC Windows 消息
对于 Windows 窗体,什么相当于 PostMessage to self?
是否有与 WPF/XAML 托管代码兼容的 C# 机制、习惯用法等可以完成相同的操作? 是否有一种 WPF/XAML 托管代码技术确实像 PostMessage 那样利用应用的输入队列?
请注意,虽然不是专家,但我多次使用C#的Task.Run((,TaskFactory.StartNew((,Control.BeginInvoke((,async/await等工具。 正如我所说,我正在寻找一些希望不需要创建新线程或任何其他不寻常的编码体操的东西。
好吧,我建议一开始就不要陷入这种情况。
但话虽如此,您可以将async void
与Task.Yield
一起使用:
async void DoSomethingAsync()
{
await Task.Yield();
// Code here will run directly off the message loop.
}
Task.Yield
将导致方法立即返回,将方法的其余部分排队到消息循环。该async void
将导致将异常直接抛到消息循环中。
好吧,你做到了。我刚刚发布了一个答案,其中包含Task.Yield
和async void
。哗啦啦,现在需要洗手...