2016-03-28 58 views
-1

我无法用我自己的话解释这一点,所以这里的情况:跨线程错误

myBindingSource.Add(new myElement()); 
SetDataSource(myBindingSource); 
myBindingSource.Add(new myElement()); 

我总是赶在加的第二次调用异常(一个跨线程除外)。这里的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; 
     } 
} 

我不明白为什么这种情况继续发生!

+0

从工作线程更新数据源是不合法的。您还需要一个ClearDataSource()方法,以便您可以将myDataGridView.DataSource属性重置为null。 –

+0

使用此答案:调用使用WPF/UI主线程的调度程序: http://stackoverflow.com/questions/11625208/accessing-ui-main-thread-safely-in-wpf –

回答

1

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

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

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

虽然我喜欢你的答案,你可以为什么这是必要的添加更详细的解释。我认为它会更充分地回答这个问题,并让你的答案脱颖而出。 –