2016-07-22 176 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