2017-06-25 48 views
2

問題:應該將「Application.Current.Dispatcher.Invoke」放入引發事件的工作線程還是處理事件的UI代碼中?它可以很好地工作,但更好的做法或差異是什麼?Application.Current.Dispatcher在調度程序線程以外的事件的使用

在創建新聞自動收錄器的WPF應用程序中,我通過Microsoft.Office.Interop.OutlookItemAdd事件從新收件箱電子郵件中檢索正文文本,然後引發傳遞正文文本的事件。主視圖模型如下訂閱此事件。在OutlookReader類:

private void OnEmailFoundWithSubjectMatchingFilter(_MailItem item) 
{ 
    System.Windows.Application.Current.Dispatcher.Invoke(() => 
    { 
     FoundEmailWithSubjectMatchingFilter?.Invoke(this, item.Body); 
    }); 
} 

而且,在MainViewModel類:

private void HandleEmailFeed(object sender, string e) 
{ 
    //Application.Current.Dispatcher.Invoke(() => 
    //{ 
    var parser = new MailBodyParser(); 

    AddFeedItem(parser.Parse(e)); 
    //}); 
} 
+0

沒有一個正確的答案。做任何更符合圖書館用戶期望的內容。有時候這被稱爲最不驚訝的原則。 –

+0

我傾向於認爲UI端應該調用調度程序,因爲工作線程不應該真正負責如何使用它的結果。真的想知道是否有任何技術/性能差異。 – JJJulien

+1

我不明白你在問什麼。按照慣例,「UI線程」是調度程序線程。如果您已經在UI線程中執行代碼,則不需要調用Dispatcher.Invoke()。您只會從線程中調用Dispatcher.Invoke(),而不會從UI線程調用。 –

回答

0

應該 「Application.Current.Dispatcher.Invoke」 放在工作線程引發一個事件或UI處理事件的代碼?

後者我會說。主要是因爲工作線程可能在不知道任何System.Windows.Application對象的類庫中啓動。

因此,工作線程應該簡單地引發事件,然後客戶端應用程序負責僅更新最初創建它們的調度程序線程上的UI元素。一個類庫不應該關心甚至不瞭解任何調度員。

+2

不知道爲什麼這是被拒絕的,但是,是的,這將是答案。這是我的第一個問題,正如Peter Duniho所說,我可以更好地表達它。直到我發佈之後,我意識到我真正想要回答的問題是:哪種模式/實踐最適合處理WPF中工作線程和調度程序線程之間的事件?這也可能太開放了,但我會改進它併發佈一個新問題。感謝您的回覆。 – JJJulien