C# 跨线程异常无效的对象异常

C# 跨线程异常无效的对象异常,c#,C#,我试图绕过一个跨线程异常,无效对象异常。以下是详细信息:我有两个后台工作线程(还有很多,但我还没有对它们进行编码,我只是对引擎进行编码,让它们目前都可以运行。这是一个C#,Windows窗体应用程序。每隔一段时间,BGWs会调用UpdateUI,它会对UI进行大量更新。所有线程都使用相同的UpdateUI,因此它被锁定。它的性能下降非常小,显然,我现在正在用一个BGW改变UI,即一个不同的线程,因此我将得到一个跨线程异常,因此我需要调用()或BeginInvoke(),但每当我这样做时,不知何故

我试图绕过一个跨线程异常,无效对象异常。以下是详细信息:我有两个后台工作线程(还有很多,但我还没有对它们进行编码,我只是对引擎进行编码,让它们目前都可以运行。这是一个C#,Windows窗体应用程序。每隔一段时间,BGWs会调用UpdateUI,它会对UI进行大量更新。所有线程都使用相同的UpdateUI,因此它被锁定。它的性能下降非常小,显然,我现在正在用一个BGW改变UI,即一个不同的线程,因此我将得到一个跨线程异常,因此我需要调用()或BeginInvoke(),但每当我这样做时,不知何故,所有这些耗时的进程都会合并到同一个线程中,并按顺序执行,而不是同时执行。这将是因为我的代码错误,而不是因为任何其他原因。我真的不知道如何使用Invoke()和BeginInvoke(),所以这是从类似线程复制的代码,而不是我自己的,但它仍然不起作用。只是看看它,它看起来很奇怪,不是我应该做的

那么,你能帮我更正Invoke()代码吗?它删除了异常,但将它们合并到一个线程中,但不确定是哪个线程,UI线程?另外,我的UpdateUI()非常长且复杂,因此理想情况下,我会调用()整个方法(基本上整个过程都需要调用)如果可能的话,不要像blow代码那样单独地执行每一行。我重复一遍,这不是我用来调用()方法的,而是简单地更改“Enabled”状态,这就是为什么它看起来很奇怪的原因

提前非常感谢

理查德

MethodInvoker method = delegate
{
    label3.Enabled = true;
};

if (InvokeRequired)
{
    BeginInvoke(method);
}
else
{
    method.Invoke();
}

您对Invoke或BeginInvoke的调用应该在目标线程中存在的控件上。因此,您应该使用或


内部调用实际上向UI线程消息队列发送消息(同步),而BeginInvoke发布消息(异步)对于消息队列,由于消息队列一次处理一条消息,您可能不需要锁定调用Invoke/BeginInvoke。

您调用Invoke或BeginInvoke的调用应该位于目标线程中存在的控件上。因此,您应该使用或


内部调用实际上向UI线程消息队列发送消息(同步),而BeginInvoke发布消息(异步)对于消息队列,由于消息队列一次处理一条消息,您可能不需要锁定调用以调用/BeginInvoke。

要确保在GUI线程上执行您的
UpdateUI
方法,请使用以下命令:

public void UpdateUI() {
    if (this.InvokeRequired) {
        this.Invoke(new MethodInvoker(UpdateUI));
    } else {
        // Changes to UI are made here.
    }
}

如果合适,将
替换为对表单的引用。

要确保在GUI线程上执行
UpdateUI
方法,请使用以下命令:

public void UpdateUI() {
    if (this.InvokeRequired) {
        this.Invoke(new MethodInvoker(UpdateUI));
    } else {
        // Changes to UI are made here.
    }
}

如果合适的话,用你的表格的引用替换这个。

这个有效!我不知道如何感谢你!对不起,我不能投票了!再次感谢!RichardThis有效!我不知道如何感谢你!抱歉,我不能投票了!再次感谢!RichardThis也确实帮助解决了这个问题!非常感谢!这是al真的帮助解决了问题!非常感谢!