【问题标题】:When the code inside Dispatcher.Invoke is executed?Dispatcher.Invoke 中的代码何时执行?
【发布时间】:2013-03-02 12:37:47
【问题描述】:

在 C# WPF 项目中,我有一个需要刷新一些用户控件的后台线程。 为此,我使用了 Dispatcher.Invoke:

    Dispatcher.Invoke(DispatcherPriority.Normal, (MethodInvoker)delegate()
    {
        // Code
    }

但我想知道:

  • 什么时候委托里面的代码会在主线程上执行?
  • 要执行它,可以停止通常在主线程上运行的方法吗?
  • 使用 Dispatcher.Invoke 会导致竞争条件吗?

非常感谢, 伊曼纽尔

【问题讨论】:

  • 此代码在主 UI 线程上运行,但我们需要更多地了解您正在尝试什么(或您遇到什么问题),以便能够明智地回答您的其余问题.

标签: c# wpf multithreading dispatcher


【解决方案1】:

委托中的代码什么时候会在主线程上执行?

如果所有operations with priority greater than Normal got a chance to execute,则委托将在主线程上执行一次。

要执行它,通常在主线程上运行的方法可以是 停了吗?

Invoke 方法使委托在主线程上同步执行,但如果要异步执行,则需要使用 BeginInvoke。如果某个委托在主线程上运行,您的 delegate will get queued and will run once executing operation gets completed.但是,除非委托被执行,否则您的后台线程不会继续前进。

使用 Dispatcher.Invoke 会导致竞争条件吗?

No,它不会因为委托在调度程序队列中排队。

【讨论】:

  • 我认为你的意思是 a在你的句子的第二部分同步。
【解决方案2】:
  1. 恰好当 UI 线程能够在 SynchronizationContext.Send 调用上切换其执行时。
  2. 执行时,通常在主线程上运行的方法将完成运行(包括其他伪非完成条件,如yieldawait),然后您的函数将运行。
  3. 没有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多