【问题标题】:MvvmLightToolkit: Is the DispatcherHelper.Initialize() method's execution needed?MvvmLightToolkit:是否需要执行 DispatcherHelper.Initialize() 方法?
【发布时间】:2014-06-17 13:00:14
【问题描述】:

Mvvm Light Toolkit 包括DispatcherHelper,这是一个非常有用的工具。它允许以非常简单的方式从后台线程同步主UI Thread。比如DispatcherHelper.CheckBeginInvokeOnUI():

//In any moment before...
DispatcherHelper.Initialize();

ThreadPool.QueueUserWorkItem(
    o => 
    {
        //Do something

        DispatcherHelper.CheckBeginInvokeOnUI(()=>StatusTextBlock.Text = "Done");
    }
);

在使用DispatcherHelper 之前,我通常使用MainThreadSynchronizationContext 来提交从非主线程到视图的任何更改。

我的问题是:为什么在使用类之前必须执行DispatcherHelper.Initialize 方法?第一次可以在静态构造函数上调用吗?例如:

public class DispatcherHelper
{
    private static void Initialize()
    {
         //...
    }
    static DispatcherHelper(){
        Initialize();
    }
    //...
}

我认为这种方式是不需要的

【问题讨论】:

  • 所以,我相信这是因为Dispatcher 通常在应用程序初始化之后才可用。 DispatcherHelper 无法从库本身知道何时发生这种情况,因此它依赖于用户告知它。使用您的方法,理论上用户可以在访问Dispatcher 之前尝试使用DispatcherHelper,因此可能会引发异常或只是不调用请求的方法。 tl;dr 这样可以保护开发人员不会造成DispatcherHelper 无法处理的情况。

标签: c# wpf silverlight windows-phone mvvm-light


【解决方案1】:

经过一番研究,我想我找到了一个很好的理由:

这个原因可能是DispatcherHelper.Initialize();方法应该在主线程中执行,如果使用静态构造函数自动完成,则静态构造函数有可能在另一个后台线程上执行。

【讨论】:

    猜你喜欢
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    相关资源
    最近更新 更多