什么';在当前线程上执行代码的C#等价于PostMessage,就在将来?

什么';在当前线程上执行代码的C#等价于PostMessage,就在将来?,c#,wpf,postmessage,runloop,C#,Wpf,Postmessage,Runloop,我在一个事件处理程序中,需要更改某些状态信息。但是,当我仍然在处理程序中时进行更改是不安全的,因此我需要在退出后执行它。但是,它必须在同一个线程上执行。这只能发生在未来,而不是现在 现在回到Win32时代,向窗口发送消息有两种选择: SendMessage,意思是“立即处理消息!”,通常是因为你当时需要结果,或者 PostMessage,它只说“将消息添加到窗口的队列中,以便运行循环可以拾取消息。” 选项2相当于我所追求的:“发布”(安排)未来某个时候执行的一些代码 注意:在这里搜索“C#相当于

我在一个事件处理程序中,需要更改某些状态信息。但是,当我仍然在处理程序中时进行更改是不安全的,因此我需要在退出后执行它。但是,它必须在同一个线程上执行。这只能发生在未来,而不是现在

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

  • SendMessage
    ,意思是“立即处理消息!”,通常是因为你当时需要结果,或者
  • PostMessage
    ,它只说“将消息添加到窗口的队列中,以便运行循环可以拾取消息。”
  • 选项2相当于我所追求的:“发布”(安排)未来某个时候执行的一些代码

    注意:在这里搜索“C#相当于PostMessage”会给您带来很多好处。然而,正如大多数关于
    PostMessage
    的问题一样,他们也在询问后台线程和在主线程上返回通知,这也不是我要问的。我说的是同一条线,只是不是现在。不管怎样,我只是想避免重复投票,因为这似乎是一个精确的匹配。不是


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

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

    //Will work sync
    SynchronizationContext.Current.Send(...);
    //Will work async
    SynchronizationContext.Current.Post(...);
    
    方法分别采用

    请也看看这篇精彩的文章

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

    Dispatcher.BeginInvoke的优先级低于正常值如何?有趣!这听起来很有希望。现在查看文档。你能举个例子快速回答吗?也会帮助其他人。@Clemens,
    SynchronizationContext.Current
    是对
    Dispatcher.BeginInvoke
    的抽象建议
    SynchronizationContext.Current
    将在内部调用,对于WPF,
    Dispatcher.BeginInvoke
    Ok,那么就这样做了。不需要显式使用Dispatcher的示例。有关详细信息,请参见。当您执行跨线程调用时,显式使用Dispatcher更容易。下面是使用BeginInvoke解决重入问题的示例。您可以发布到当前线程的
    SynchronizationContext
    。它也将在同一线程上工作。您不需要通过使用
    SynchronizationContext
    在线程之间创建同步。如果您创建了一个新的任务线程,则
    SynchronizationContext。对于这些线程,Current
    返回
    null
    。您必须在变量中捕获同步上下文。这就是他们在你发布的文章中所做的。@Dirk,取决于你创建任务或线程的方式。SynchronizationContext可以被捕获或设置为null。例如,如果您正在线程池上运行
    Task.Run
    ,则
    SynchronizationContext.Current
    的值将为空,这只是给您一个提示。这太完美了!这是它的用途。。。使用具有动态资源的绑定:@MarqueIV,我很高兴能为您提供帮助:)我需要根据树视图中的选择触发描述更新。更新的需要可能由control Enter触发,但仅仅发布消息将在treeview选择可能发生更改之前完成。在这种情况下,使用具有短超时的计时器优于发布