WPF /线程:控件上的Dispatcher static vs Dispatcher?

时间:2011-01-06 22:46:47

标签: c# wpf

我在调度员方面有点困惑。假设我在后台线程上进行某种长时间的操作。我想通过调度程序更新我理解的ui线程。我的问题是,我是否静态调用调度程序:Dispatcher.BeginInvoke(mywork)...或者我想要更新的控件:mytextbox.Dispatcher.BeginInvoke(mywork)

3 个答案:

答案 0 :(得分:15)

值得注意的是,调用Dispatcher.BeginInvoke 不是静态调用:它是隐式this.Dispatcher.BeginInvoke。如果您可以使用此调用,则可能已在控件或窗口中编写代码。在这种情况下,您可能可能安全地调用,因为大多数情况下每个应用程序将有一个UI线程。

实际的静态调用将是Dispatcher.CurrentDispatcher.BeginInvoke,这是你要调用的东西(参见我对Hasan Khan的答案的评论)。

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

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

答案 1 :(得分:1)

首先,我认为理解Dispatcher并非旨在处理大型后台操作非常重要。它旨在将工作排入队列的UI线程。这是一篇关于.NET线程模型和Dispatcher的一篇有价值的MSDN文章:

说实现Dispatcher.BeginInvoke方法的标准方法是在控件上调用它:

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

希望有所帮助!

答案 2 :(得分:0)

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