Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 交叉线程错误_C#_Multithreading_Bindingsource - Fatal编程技术网

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主线程的调度程序调用:虽然我喜欢您的答案,但您可以添加一个更详细的解释,说明为什么需要这样做。我认为这将更充分地回答这个问题,并使你的答案脱颖而出。