【问题标题】:Getting Cross-thread operation not valid in C# [duplicate]在 C# 中获取跨线程操作无效 [重复]
【发布时间】:2010-10-24 21:40:57
【问题描述】:

可能重复:
Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on

我正在编写一些代码,在其中初始化一个对象(在本例中为表单),然后该对象处于空闲状态,直到它接收到来自某人的消息,或者直接调用其方法之一。

在我的表单中,我有一个列表框 (lTester),它显示了对该表单的所有调用。在运行时出现以下错误:

跨线程操作无效: 从 a 访问的控件“lTester” 线程以外的线程 创建于。

我没有手动启动任何线程,事实上我从未使用过它们,也不真正了解 C# 如何在内部管理 UI 组件。有没有办法解决这个问题?

【问题讨论】:

  • 收到消息时如何更新列表框?你能显示你的代码吗?检查 Control.InvokeRequired 属性(System.Windows.Forms)bit.ly/c8dws8
  • 收到消息是什么意思?是来自其他组件吗?
  • 刮掉消息部分。我通过 lTester.Items.Add(""); 更新我的列表框命令。换句话说,我有一个名为 update 的方法,并在其中运行上述命令。所以从另一个类我会调用 tester.update(x)

标签: c# multithreading exception-handling


【解决方案1】:

在触摸ITester 之前,您必须检查InvokeRequired 的值。如果为真,调用函数Invoke

【讨论】:

    【解决方案2】:

    如果你想知道你的线程来自哪里,你可以在你知道被调用的方法中放置一个断点(错误产生的地方),在 VS 中打开线程和堆栈跟踪窗口,看看启动了什么开始的电话。

    即使代码位于您的 Form 类中,调用者仍然决定调用在哪个线程中执行。这就是为什么,正如 Oskar 所说,您必须检查是否需要 Invoke 到主线程。有很多关于如何做到这一点的示例,只需 Google InvokeRequired 并从那里开始。

    如果您需要示例,请告诉我。

    【讨论】:

    • 好的,我想这对这种情况来说是可行的。困扰我的是,我不明白这些多个线程是从哪里来的,即:这一切是如何在内部进行的。
    • 既然你没有发布任何代码,我们也不会。您说“接收某人的消息”,这到底是什么意思?怎么收?来自谁或什么?
    • 这是一个错误,我的测试程序类实际上有它可以引发的事件,这些事件可以被其他类捕获和处理。就接收消息而言,我通过 lTester.Items.Add(""); 更新我的列表框。命令。换句话说,我有一个名为 update 的方法,并在其中运行上述命令。所以从另一个类我会调用 tester.update(x)
    • 谜团解开了。 Tester 公开其他人订阅的事件。当 Tester 引发事件时,会创建新线程以供侦听器接收。想一想——如果没有创建新线程,事件源将不得不一个接一个地迭代每个侦听器,调用它们的委托并等待其完成,然后再进入下一个。现在您有另一个对象在与 Tester 不同的线程上运行。因此,当您回调 tester 时,您的调用不在创建 Tester 的主线程上。因此,如果 Tester 的委托尝试访问 UI 控件,它将得到一个错误。
    猜你喜欢
    • 2010-12-04
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2012-08-22
    • 1970-01-01
    相关资源
    最近更新 更多