2011-01-06 63 views
8

我对调度员有点困惑。假设我正在进行某种长时间操作的后台线程。我想更新ui线程我明白我通过调度程序执行此操作。我的问题是,我是否像调用静态调用Dispatcher:Dispatcher.BeginInvoke(mywork)...或者我想更新的控件上:mytextbox.Dispatcher.BeginInvoke(mywork)WPF /线程:Dispatcher static vs Dispatcher on a control?

回答

0

首先,我认为理解,Dispatcher不是为了处理大背景操作而设计的。它被设计为在一个对象的UI线程上排队工作。下面是有关.NET线程模型和Dispatcher一个有价值的MSDN文章:

话说实施Dispatcher.BeginInvoke方法的标准方法是调用它的控制:

startStopButton.Dispatcher.BeginInvoke(
    DispatcherPriority.Normal, new NextPrimeDelegate(CheckNextNumber) 
); 

希望有帮助!

14

值得注意的是,拨打Dispatcher.BeginInvoke不是静态调用:这是一个隐含的this.Dispatcher.BeginInvoke。如果您可以使用此调用,那么您可能已经从控件或窗口中编写了代码。在这种情况下,您可能是可能是,因为大多数情况下每个应用程序都会有一个UI线程。

实际的静态调用将是Dispatcher.CurrentDispatcher.BeginInvoke,这是而不是你想要调用的东西(请参阅我对哈桑汗的回答为什么的评论)。

编辑:调用Application.Current.Dispatcher坏事。 (并且,为了清楚起见,它是一个实例属性,而不是静态 - 在Application的静态/单例实例上调用。)此属性将为创建应用程序的线程返回Dispatcher,并且通常这是线程UI也在创建 - 因此Application.Current.Dispatcher返回与myWindow.Dispatcher相同的调度程序。

静态调用Dispatcher.CurrentDispatcher(我警告过)会为您调用的线程返回Dispatcher。如果你从后台线程调用它,你会得到一个专门为该线程创建的新Dispatcher - 这通常不是想要的。

+0

*为什么*正在使用`Application.Current.Dispatcher`坏主意?到目前为止,我在应用程序中使用它并没有任何问题。它只需要'Application()。Run()`被调用。 – Aphex 2011-02-23 15:49:04

0

虽然使用案件要么DispatcherObject.Dispatcher(所有依赖对象和控件DispatcherObject继承,等等)或Application.Current.Dispatcher是做正确的事,因为这通常只有一个UI线程,可以有多个UI线程,不同的窗口可以使用不同的调度程序。在这种情况下,使用其调度程序更新控件很重要。它存储在其Dispatcher属性(从DispatcherObject继承)中,此窗口中的任何其他控件和窗口本身。

相关问题