C# 交叉线程错误
我无法用自己的话来解释,所以情况如下:C# 交叉线程错误,c#,multithreading,bindingsource,C#,Multithreading,Bindingsource,我无法用自己的话来解释,所以情况如下: myBindingSource.Add(new myElement()); SetDataSource(myBindingSource); myBindingSource.Add(new myElement()); 我总是在第二次调用Add时捕获异常(跨线程异常)。下面是SetDataSource的void: delegate void SetDataSourceCallback(BindingSource db); private void SetDa
myBindingSource.Add(new myElement());
SetDataSource(myBindingSource);
myBindingSource.Add(new myElement());
我总是在第二次调用Add时捕获异常(跨线程异常)。下面是SetDataSource的void:
delegate void SetDataSourceCallback(BindingSource db);
private void SetDataSource(BindingSource db)
{
if (myDataGridView.InvokeRequired)
{
SetDataSourceCallback d = new SetDataSourceCallback(SetDataSource);
myDataGridView.Invoke(d, new object[] { db });
}
else
{
myDataGridView.DataSource = db;
}
}
我不明白为什么这种事一直发生 使用主UI线程的调度程序从任何其他线程安全地调用任何UI代码 WPF不能让您从“主”UI线程以外的其他线程更改任何UI状态。所以一般来说,如果您有任何改变UI的状态,您应该用Dispatcher.Invoke代码将其包装起来
Application.Current.Dispatcher.Invoke(new Action(() => {
myBindingSource.Add(new myElement());
SetDataSource(myBindingSource);
myBindingSource.Add(new myElement());
}));
从工作线程更新数据源是不合法的。您还需要一个ClearDataSource()方法,以便将myDataGridView.DataSource属性重置回null。使用以下答案:使用WPF/UI主线程的调度程序调用:虽然我喜欢您的答案,但您可以添加一个更详细的解释,说明为什么需要这样做。我认为这将更充分地回答这个问题,并使你的答案脱颖而出。