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

for*_*yez 9 c# wpf

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

Dan*_*zey 15

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

实际的静态调用是Dispatcher.CurrentDispatcher.BeginInvoke,这是不是你要调用(看到我对哈桑·汗的回答评论为什么)的东西.

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

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


Mar*_*erl 2

首先,我认为重要的是要理解,它Dispatcher并不是为处理大型后台操作而设计的。它旨在对对象的 UI 线程上的工作进行排队。这是一篇关于 .NET 线程模型的有价值的 MSDN 文章Dispatcher

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

startStopButton.Dispatcher.BeginInvoke(
    DispatcherPriority.Normal, new NextPrimeDelegate(CheckNextNumber)
);
Run Code Online (Sandbox Code Playgroud)

希望有帮助!