我有一个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()
方法感到好奇。
答案 0 :(得分:0)
我建议你在UI线程中运行你的代码,而不是使用另一个线程。当数据正在改变绑定源时,它最终会改变盲目控制。因此,您需要使用UI线程而不是工作线程来加载数据。
一个例子是BindingSource链接到DataTable,DataGrid绑定到BindingSource。您可能会想为什么不使用工作线程将数据加载到DataTable,这样可以避免锁定UI线程。但是,这不起作用,因为BindingSource最终需要更新您的DataGrid,这是一个UI操作。