BindingSource,BindingList,DataGridView和跨线程访问

时间:2011-12-08 11:09:40

标签: c# .net bindingsource multithreading bindinglist

我有一个DataGridView,其源设置为BindingSource,其来源设置为BindingList,其中包含实现INotifyPropertyChanged的对象。问题是,更新我的BindingList中的项目的逻辑在一个单独的线程中运行。一切都很好,但我不确定它为什么会起作用。是否有任何逻辑可以处理跨线程访问?在这种情况下,正确的方法是什么?

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()方法感到好奇。

1 个答案:

答案 0 :(得分:0)

我建议你在UI线程中运行你的代码,而不是使用另一个线程。当数据正在改变绑定源时,它最终会改变盲目控制。因此,您需要使用UI线程而不是工作线程来加载数据。

一个例子是BindingSource链接到DataTable,DataGrid绑定到BindingSource。您可能会想为什么不使用工作线程将数据加载到DataTable,这样可以避免锁定UI线程。但是,这不起作用,因为BindingSource最终需要更新您的DataGrid,这是一个UI操作。