题
当您在 C# 中进行数据绑定时,更改数据的线程也会导致控件发生更改。但是,如果该线程不是创建控件的线程,您将收到非法跨线程操作异常。
有什么办法可以防止这种情况发生吗?
没有正确的解决方案
其他提示
您应该能够执行以下操作:
if (control.InvokeRequired)
{
control.Invoke(delegateWithMyCode);
}
else
{
delegateWithMyCode();
}
InvokeRequired 是 Controls 上的一个属性,用于查看您是否位于正确的线程上,然后 Invoke 将在正确的线程上调用委托。
更新:事实上,在我上一份工作中,我们做了这样的事情:
private void SomeEventHandler(Object someParam)
{
if (this.InvokeRequired)
{
this.Invoke(new SomeEventHandlerDelegate(SomeEventHandler), someParam);
}
// Regular handling code
}
这消除了对 else 块的需要,并在某种程度上收紧了代码。
由于我没有测试用例可供参考,所以我无法保证这个解决方案,但在我看来,类似于用于更新不同线程中的进度条(使用委托)的场景在这里是合适的。
public delegate void DataBindDelegate();
public DataBindDelegate BindData = new DataBindDelegate(DoDataBind);
public void DoDataBind()
{
DataBind();
}
如果数据绑定需要由特定线程完成,那么就让该线程来完成工作!
如果线程调用是“非法的”(即DataBind 调用会影响不是在调用它的线程中创建的控件),那么您需要创建一个委托,以便即使 DataBind 的决策/准备不是在控件创建线程中完成,任何由此产生的修改他们(即DataBind()) 将是。
您可以从工作线程调用我的代码,如下所示:
this.BindData.Invoke();
然后,这将导致原始线程执行绑定,这(假设它是创建控件的线程)应该起作用。
在 WPF 和 Silverlight 中,绑定基础结构负责切换到 UI 线程。
不隶属于 StackOverflow