2009-11-09 52 views
0

以下是我們使用線程/調度程序進行多任務處理的兩種方法: 我在想如果有人有任何建議哪一個更好選項。WPF線程問題更好選項

片段1:

Thread t = new Thread(new ThreadStart(delegate 
       { 
        MyMethod(); 
       })); 
t.IsBackground = true; 
t.Start(); 
t.Join(); 

片段2:

Dispatcher.CurrentDispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, 
      (dummyDelegate)delegate 
      { 
       MyMethod(); 

      } 
    ); 

請指教。 謝謝 N

+0

也許原來的海報意味着在代碼片段2中使用this.Dispatcher.Invoke來運行此對象所屬UI線程上的代碼?使用Dispatcher.CurrentDispatcher只是在同一個線程上同步執行代碼。 – Anton 2009-11-09 03:24:42

回答

0

任何錯誤使用老好人BackgroundWorker?

,讓您可以在WPF中使用它,它不是具體的WinForms。

2

兩者都不是「更好」:它們是不同的。

第一個示例在後臺線程上運行MyMethod。因此,如果MyMethod阻塞,例如在網絡活動或執行一些計算密集的事情,這不會阻止UI線程,並且UI保持響應。 (儘管你的示例代碼會阻止並等待,但是你目前正在失去這個優勢。)缺點是如果MyMethod想要讀取或更新UI,必須跳過一些小圈子。

第二個示例在UI線程上運行MyMethod。這允許MyMethod與UI中的元素進行無限制的交互,但如果MyMethod花費很長時間,因爲它在MyMethod運行時凍結UI,則不適用。

所以這取決於MyMethod的功能。如果MyMethod更新了幾個UI元素,然後退出,請使用第二個選項。如果MyMethod加載文件或下載數據,和/或執行冗長的計算,請使用第一個。

1

還有第三種選擇:使用線程池執行短暫的異步調用。例如:

System.Threading.Threadpool.QueueUserWorkItem(
    delegate(object context) 
    { 
     // context is unused 
     MyMethod(); 
    }); 

這將使用線程池中的一個線程來執行MyMethod。該方法完成後,該線程將返回到池中。這種方法的優點是你不必自己管理線程的生命週期,也不需要創建和銷燬線程的內存和性能開銷。