对于WPF / XAML应用程序,Windows API PostMessage等效于自己?

时间:2015-10-12 23:43:10

标签: c# wpf xaml postmessage delayed-execution

在过去的旧时代" Windows应用程序开发,使用PostMessage Windows API函数将消息发布到您自己的应用程序是一种很好的方式,可以将特定任务的处理移出当前堆栈上下文,同时保持主线程,从而避免尝试的细微差别在另一个线程上执行主线程任务(这当然导致使用Invoke样式方法将处理重新移动到主线程等)。

你所要做的就是:

  • 创建数字值大于WM_USER
  • 的自定义Windows消息
  • 使用PostMessage将该消息广播给您自己
  • 在主对话框窗口中添加处理程序以处理自定义WM_ *消息的消息并对其执行操作

这使得您可以将处理从棘手的执行上下文中移出,例如深层嵌套的调用堆栈中可能使用持有资源锁等的方法,而是延迟处理到"清理器"执行上下文。

例如,我确实不喜欢在属性setter / getter中做很多事情,特别是对于依赖属性,除了保存或恢复值。那个和事件处理程序是执行上下文的两个主要示例,我想延迟与特定事件关联的任务并将其传递回主线程以在主线程的顶级执行# 39; s执行上下文。

我想对我的WPF / XAML应用做同样的事情,但我想只使用托管代码,所以我不想在可能的情况下使用Windows API调用,所以我试图避免在以下两个SO帖子中做类似的事情:

How to create C# Event to handle MFC Windows message from PostMessage()

What's the equivalent of PostMessage to self, for Windows Forms?

是否有与WPF / XAML托管代码兼容的C#机制,习惯用法等,以实现相同的目标?。有没有像PostMessage那样使用应用程序输入队列的WPF / XAML托管代码技术?

注意,虽然不是专家,但我已经多次使用C#的Task.Run(),TaskFactory.StartNew(),Control.BeginInvoke(),async / await等。正如我所说,我正在寻找一些希望不需要创建新线程或任何其他不寻常的编码体操的东西。

1 个答案:

答案 0 :(得分:2)

嗯,我建议不要首先陷入这种情况。

但是那样说, 可以<{1}}使用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的答案。 Blech,现在需要洗手......