在不久的将来在当前线程上执行代码的PostMessage的C#等价方式是什么?

时间:2018-09-03 07:06:16

标签: c# wpf postmessage runloop

我遇到的情况是我在事件处理程序中,因此我需要更改某些状态信息。但是,当我仍在处理程序中时,更改是不安全的,因此我需要在退出后执行它。但是,它确实必须在同一线程上执行。它只是将来必须发生,而不是现在。

现在回到Win32时代,您有两种选择可以将消息发送到窗口:

  1. SendMessage,意思是“立即处理消息!”,通常是因为您当时需要结果,或者...
  2. PostMessage,它只说“将消息添加到窗口的队列中,以便运行循环可以接收它。

选项2相当于我要做的事情:“发布”(计划)将来某个时候要执行的代码。

  

注意:在此处搜索“相当于PostMessage的C#”会给您this seemingly-related question。但是,正如关于PostMessage的大多数问题一样,他们也在询问后台线程并在主线程上获取通知,这也不是我要问的。我专门在谈论同一线程,但现在还没有。无论如何,只是试图避免重复的选票,因为这似乎是完全匹配。不是。

那么我不需要调用结果的PostMessage的C#/ WPF是什么,但是它仍必须在同一线程上发生,并且在当前事件已完全处理之后的某个时间?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,那么您追求的是

//Will work sync
SynchronizationContext.Current.Send(...);
//Will work async
SynchronizationContext.Current.Post(...);

方法分别。

也请看看这篇奇妙的文章 https://blogs.msdn.microsoft.com/pfxteam/2012/06/15/executioncontext-vs-synchronizationcontext/

答案 1 :(得分:-1)

一种粗略但易于理解的方法是启用计时器,然后在计时器启动时完成工作。