2012-03-31 48 views
7

在我的WPF應用程序中,我在構造函數中使用Dispatcher.BeginInvoke加載內容。我的問題是它會阻止UI線程?Dispatcher.BeginInvoke和Task.Factory.StartNew之間的區別

或者是更好地使用Task.Factory.StartNew,然後在UI上分派回來,這樣無論加載內容處理時間如何,應用程序都會首先加載?

哪個更好?爲什麼?

回答

20

他們做了兩個非常不同的事情:

  • Task.Factory.StartNew時間表上 線程池線程執行的委託。當前線程繼續運行而不等待此任務的結果(異步)。通常你會產生一個長時間運行的後臺任務,這樣用戶界面不會被阻塞太久(不是「凍結」)。

  • Dispatcher.BeginInvoke安排代理在 調度程序(UI)線程上執行。通常,這是通過在後臺線程上執行某些操作的結果來更新某些UI 控件。基本上你在這裏更新UI。

直接回答你的問題:

你不應該在調度線程調度冗長的操作,通常你只是想在這裏更新UI控件。委託中的代碼將在UI線程上執行,該線程在執行時被阻塞。只需將Thread.Sleep(10000)放入當前代碼(您從構造函數中計劃),您將看到UI將凍結。使用後臺任務 - Task或後臺工作者(都將使用線程池線程)。

或者是它更好地使用Task.Factory.StartNew然後派遣 一切回到界面,因此應用程序將加載第一,不論 加載內容的處理時間。

是的!

+0

感謝您的回覆,將Dispatcher.BeginInvoke阻止用戶界面..在我的應用程序。我需要在加載時調用一些服務,如果服務停止,那麼它會掛起UI,儘管我已經使用Dispatcher.BeginInvoke,所以我的基本問題是在這種情況下使用調度程序或任務? – 2012-03-31 05:04:13

+2

如果你想在*後臺運行*使用任務,如果你想發送結果到UI使用'Dispatcher.BeginInvoke' – BrokenGlass 2012-03-31 05:05:58