用于UI线程访问的Application.Current.Dispatcher与DependencyObject.Dispatcher

时间:2013-11-16 23:14:17

标签: c# .net wpf multithreading

当我需要访问UI线程时,我通常只使用 Application.Current.Dispatcher.BeginInvoke(...) 但是有适当的时间来使用 someDependencyObject.Dispatcher.BeginInvoke(...)

我假设在UI线程上创建了所有DependencyObjects / UIElements,因此最终结果应该相同或类似。

  • 电话之间有什么区别(如果有的话)?

  • 是否有关于何时使用其中一个的规则?

1 个答案:

答案 0 :(得分:3)

并非所有DispatcherObject实例都必须在主UI线程上创建(某些应用程序使用每个Window方法的线程)。

我个人建议使用DispatcherObject.Dispatcher.BeginInvoke,无论哪个线程创建了实体,代理中DispatcherObject的使用都会成功。

// Will always work
myTextBox.Dispatcher.BeginInvoke(new Action(myTextBox.Focus));

使用Application.Current.Dispatcher.BeginInvoke,如果在不同的线程上创建实例,则DispatcherObject的使用可能会失败。

// May fail if myTextBox was created on a different thread
Application.Current.Dispatcher.BeginInvoke(new Action(myTextBox.Focus));