2011-12-08 95 views
1

我有一個DataGridView,其源設置爲BindingSource,其源設置爲BindingList,包含實現INotifyPropertyChanged的對象。問題是,更新我的BindingList中項目的邏輯運行在單獨的線程中。一切都很好,但我不確定爲什麼它可以工作。有沒有任何邏輯來處理跨線程訪問?在這種情況下,正確的方法是什麼?BindingSource,BindingList,DataGridView和跨線程訪問

BindingSource _actionsBindingSource; // it's DGV's source 
BindingList<IAction> _actionsList = ...; 
... 
interface IAction : INotifyPropertyChanged 
{ 
    ... 
} 
... 
actionsBindingSource.DataSource = _actionsList; 
... 
public void FireActions() 
{ 
    new Thread(() => 
    { 
    foreach (IAction action in _actionsList) 
    { 
     action.Execute(); // fires some PropertyChangedEventArgs events from non-UI thread 
    } 
    }).Start();  
} 

所以,我很好奇我的FireActions()方法。

回答

0

我會建議你在UI線程中運行你的代碼而不是使用另一個線程。當數據改變綁定源時,它最終會改變致盲控制。因此,您需要將數據加載到使用UI線程而不是工作線程。

一個例子是一個BindingSource鏈接到一個DataTable,一個DataGrid綁定到BindingSource。您可能會想,爲什麼不使用工作線程將數據加載到DataTable,這將避免鎖定UI線程。然而,這不會工作,因爲BindingSource最終需要更新您的DataGrid,這是一個UI操作。