【问题标题】:Application.Current.Dispatcher vs DependencyObject.Dispatcher for UI Thread AccessUI 线程访问的 Application.Current.Dispatcher 与 DependencyObject.Dispatcher
【发布时间】:2013-11-30 06:23:57
【问题描述】:

当我需要访问 UI 线程但有合适的时间使用 someDependencyObject.Dispatcher.BeginInvoke(...)

时,我通常只使用 Application.Current.Dispatcher.BeginInvoke(...)

我假设所有的 DependencyObjects/UIElements 都是在 UI 线程上创建的,所以最终结果应该是相同或相似的。

  • 调用之间有什么区别(如果有)?

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

【问题讨论】:

    标签: c# .net wpf multithreading


    【解决方案1】:

    并非所有 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));
    

    【讨论】:

    • 但是@Lukazoid:我们不能在 ViewModel 仪式中拥有控件引用吗?如果我需要在 UI 线程中做某事,则从那里开始。那么该怎么办呢?
    • @Arijit 这听起来像是另一个问题,例如这个:How to pass the UI Dispatcher to the ViewModel,看看这是否解决了您的问题,如果不搜索像您这样的问题,如果不存在,请提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 2015-06-02
    • 2010-10-17
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    相关资源
    最近更新 更多