2010-05-20 22 views
1

我正試圖解決一個經典問題 - 我有一個多線程應用程序,它運行一些 處理器密集型計算,帶有一個GUI界面。我可以安全地綁定到多線程應用程序上的數據嗎?

每次一個線程已經完成了任務,我想 更新桌子上

任務id狀態|狀態

我使用的DataGridView和的BindingList以下列方式:

BindingList<Task> tasks; 
dataGridView.DataSource = tasks 

public class Task : INotifyPropertyChanged 
{ 
    ID{get;} 
    Status{get;set;} 
} 

可以後臺線程安全地更新任務的狀態? 和更改將在GUI中以正確的順序顯示?

第二個問題: 什麼時候需要致電PropertyChanged? 我試着用和不用調用運行,似乎沒有理會..

第三題: 我已經看到了這MSDN使用的dataGridView BindingSource的 爲DataGridView.DataSource和的BindingList 之間的調停這是真的必要?

回答

5

1 - 否。在更新數據綁定屬性之前,後臺任務必須與UI線程同步。這可以通過使用預定爲TaskScheduler.FromCurrentSynchronizationContextTask來完成。

如果你不是在.NET 4.0,但(例如,Task不可用),然後就看你的「任務」是如何運作的:以「完成」的概念,一個任務可以使用BackgroundWorker和無限期運行的任務可以使用SynchronizationContext.Post

2 - PropertyChanged被綁定用來更新其顯示。不知道爲什麼它沒有調用它爲你工作...

3 - BindingSource提供了各種功能;請參閱What Is a BindingSource and Why Do I Need It?

順便說一句:歡迎您就SO提出多個問題。這個問題應該是三個。

+0

現在我更好地理解問題2的答案了: 我每次滾動視圖時都會看到所有正在運行的任務的狀態 無效並且狀態已更改。當我沒有滾動,沒有任何變化 謝謝! – Paul 2010-05-20 14:31:42

1

如果您一次只運行一個後臺任務,BackgroundWorker可以解決您的問題,您可以訂閱WorkCompleted事件來更新您的UI。否則,如果有多個線程正在使用Control.BeginInoke解決您的更新UI問題,那麼在WPF上它將是Dispatcher.BeginInvoke。

propertyChanged在您的屬性集上被調用。但是如果你使用一個集合作爲你的BindingObject,我會使用ObservableCollection。

相關問題