0

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

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

但我想知道:

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

非常感谢,伊曼纽尔

4

2 回答 2

2

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

如果所有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,它不会因为委托在调度程序队列中排队。

于 2013-03-02T12:47:04.440 回答
0
  1. 正是当 UI 线程能够在SynchronizationContext.Send调用时切换其执行。
  2. 执行时,通常在主线程上运行的方法将完成运行(包括其他伪非完成条件,如yieldor await),然后运行您的函数。
  3. 不。
于 2013-03-02T12:44:53.217 回答