非法交叉线程操作异常的任何解决方案?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非法交叉线程操作异常的任何解决方案?相关的知识,希望对你有一定的参考价值。

当您在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线程。

以上是关于非法交叉线程操作异常的任何解决方案?的主要内容,如果未能解决你的问题,请参考以下文章

关闭从另一个对话框片段启动的对话框片段会导致非法状态异常

在 fragmenStatePagerAdapter 的嵌套片段中,非法状态异常-指定的子级已经有父级

onActivityResult 中的非法状态异常

在 Netbeans 上编译:“线程“AWT-EventQueue-0”中的异常 java.lang.RuntimeException:无法编译的源代码 - 表达式的非法开始”[关闭]

线程“主”java.nio.file.InvalidPathException 中的异常:索引 2 处的非法字符 <:>:

我的javascript片段返回“非法字符”