当您在C#中进行数据绑定时,更改数据的线程也会导致控件更改。但是,如果此线程不是创建控件的线程,则会出现非法交叉线程操作异常。
有没有阻止这个?
答案 0 :(得分:3)
您应该可以执行以下操作:
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块的需要,并且使代码变得紧张。
答案 1 :(得分:1)
由于我没有测试用例,我不能保证这个解决方案,但在我看来,类似于用于更新不同线程中的进度条的方案(使用委托)将是适合这里。
public delegate void DataBindDelegate();
public DataBindDelegate BindData = new DataBindDelegate(DoDataBind);
public void DoDataBind()
{
DataBind();
}
如果数据绑定需要由特定线程完成,那么让该线程完成工作!
答案 2 :(得分:0)
如果线程调用是“非法的”(即DataBind调用会影响在调用它的线程中未创建的控件),那么您需要创建一个委托,以便即使DataBind的决策/准备工作是没有在控制创建线程中完成,它们的任何结果修改(即DataBind())都将是。
您可以像工作线程一样调用我的代码:
this.BindData.Invoke();
这会导致原始线程进行绑定,(假设它是创建控件的线程)应该可以工作。
答案 3 :(得分:0)
在WPF和Silverlight中,绑定基础结构负责切换到UI线程。