2012-05-16 50 views
1

即時閱讀一本書WPF,我看到這樣的代碼:UI線程與BackgroundWorker的線程

private void bgw1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     int percenti; 
     percenti = e.ProgressPercentage; 
     progressBar1.Value = percenti; 
    } 

的問題很簡單。 如果

進度屬於UI線程和 BackgroundWorker的工作與後臺線程

爲什麼沒有錯誤(如:調用線程不能因爲不同的線程擁有它訪問該對象。)?

謝謝。

回答

3

爲什麼沒有錯誤(如:調用線程無法訪問此對象,因爲不同的線程擁有它。)?

這是使用BackgroundWorker的主要優點之一。 BackgroundWorker組件會自動將調用進度和完成的調用返回到啓動作業的同步上下文(線程)。

在這種情況下,這意味着ProgressChanged(和完成事件)的事件處理程序發生在WPF UI線程上。

2

BackgroundWorker爲您處理線程上下文切換。事件BackgroundWorker.ProgressChanged將在UI線程中引發,因此您的回調bgw1_ProgressChanged將在UI線程的上下文中調用。

這是BackgroundWorker存在的主要目的:使異步工作與UI結合起來變得簡單直接。

BackgroundWorker自.NET 1.0起存在。現在,我們生活在2012年,我們有Task類和Task Parallel Library和很快c#async關鍵字作爲一切異步的一般手段,使BackgroundWorker種過時或至少是舊學校。