2016-07-22 173 views
0

我已经阅读了许多关于Application.Current.Dispacher在单元测试时为null的文章。这是我的确切问题。我发现This这正是我正在寻找的。但是,似乎当我去实现这个我不能编译。出现以下错误:使用Application.Current.Dispatcher进行单元测试

无法在此处访问私有构造函数'Dispatcher'。

在上面的文章中,他们声明有很多方法来实现我下面的代码。因为他没有检查多线程安全检查。我怎样才能做这些检查,并得到这个编译?

public static Dispatcher RootDispatcher 
    { 
     get 
     { 
      if (_rootDispatcher == null) 
      { 

       if (Application.Current != null) 
       { 
        _rootDispatcher = Application.Current.Dispatcher; 
       } 
       else 
       { 
        var thread = Thread.CurrentThread; 
        _rootDispatcher = new Dispatcher(thread); 
       } 
      } 
      return _rootDispatcher; 
     } 
     internal set { _rootDispatcher = value; } 
    } 

回答

2

编译错误是由于这样的事实,你试图使用构造其实是私人(和你有一个参数,它并不需要调用它)

综观Dispatcher.Current的文档,它说:

获取当前正在执行的线程 ,并创建一个新的,如果其中一个已不与线程关联 。

所以,你可以使用:

  • _rootDispatcher = Dispatcher.CurrentDispatcher;

导致调度实例。

作为优化,您可以始终使用Dispatcher.CurrentDispatcher作为'RootDispatcher'。不管是否存在Application.Current

如果您在生产和测试中都选择了此代码,则需要区分这些方案。在生产中使用Application的Dispatcher,并在单元测试中使用'any'Dispatcher(Dispatcher.Current),因为应用程序不在那里。

+0

谢谢,那么我应该不创建rootdispacher类? – JamTay317

+0

Dispatcher.CurrentDispatcher将返回一个新的Dispatcher实例,如果当前线程没有附加到它的话。 因此它应该是安全的单元测试场景。 如果您在生产和测试中都有此代码,则需要进行区分。 – LoekD