跨线程错误

时间:2016-03-28 17:11:16

标签: c# multithreading bindingsource

我无法用自己的话解释这一点,所以情况如下:

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;
        }
}

我无法理解为什么会这种情况继续发生!

1 个答案:

答案 0 :(得分:1)

使用主UI线程的调度程序安全地调用来自任何其他线程的任何UI代码。

WPF不允许您从" main"以外的其他线程更改任何UI状态。 UI线程。所以一般来说,如果你有任何改变UI的状态,你应该用Dispatcher.Invoke代码包装它。

Application.Current.Dispatcher.Invoke(new Action(() => {
   myBindingSource.Add(new myElement());
   SetDataSource(myBindingSource);
   myBindingSource.Add(new myElement());
 }));