C# 有没有解决非法跨线程操作异常的方法?

C# 有没有解决非法跨线程操作异常的方法?,c#,data-binding,C#,Data Binding,在C#中绑定数据时,更改数据的线程也会导致控件更改。但是,如果该线程不是创建控件的线程,则会出现非法的跨线程操作异常 有什么方法可以防止这种情况发生吗?您应该能够执行以下操作: if (control.InvokeRequired) { control.Invoke(delegateWithMyCode); } else { delegateWithMyCode(); } InvokeRequired是控件上的一个属性,用于查看您是否在正确的线程上,然后Invoke将在正确的线

在C#中绑定数据时,更改数据的线程也会导致控件更改。但是,如果该线程不是创建控件的线程,则会出现非法的跨线程操作异常


有什么方法可以防止这种情况发生吗?

您应该能够执行以下操作:

if (control.InvokeRequired)
{
    control.Invoke(delegateWithMyCode);
}
else
{
    delegateWithMyCode();
}
InvokeRequired是控件上的一个属性,用于查看您是否在正确的线程上,然后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())都将被删除

您可以从工作线程调用我的代码,如下所示:

this.BindData.Invoke();

这将导致原始线程进行绑定,而绑定(假定是创建控件的线程)应该可以工作。

在WPF和Silverlight中,绑定基础结构负责切换到UI线程