c# - 不一致 "Cross-thread operation not valid"异常

标签 c# .net multithreading winforms exception

Cross-thread operation not valid: Control '' accessed from a thread other than the thread it was created on.

我的同事在我的代码中遇到了这个异常,但我没有。

在窗体上,我有一个控件,用户可以在其中向 ListView 添加一些字符串。

我在我的控件中公开了一个属性,该属性返回 XmlDocument 中的字符串。

public XmlDocument XmlConfig
{
    get
    {
        return GetXML();
    }
}

Get XML 只是获取 ListViewItem 集合并将它们格式化为 xml 文档。

private XmlDocument GetXML()
{
    foreach(ListViewItem lvi in myListView.Items)   <-- Exception Here
    {
         // Do Stuff
    }
}
  1. 为什么我在尝试阅读 ListView 时会收到此消息?我认为跨线程异常是在您尝试从单独的线程更新控件时发生的。

  2. 为什么我也没有得到这个异常?

最佳答案

I thought cross thread exceptions were when you were trying to update the control from a separate thread

不是真的。当不是从主 UI 线程访问控件时,会发生跨线程异常。解决方案很简单,检查InvokeRequired并使用 Invoke .

至于为什么你的 friend 点击了这个而你没有点击,从你发布的代码中无法分辨。可能是他针对不同的 .Net 目标版本进行编译,或者可能是您的硬件未命中的竞争条件(例如,他有更多的内核)。重点是那是无关紧要的。您的代码需要是线程安全的,因为显然 GetXML 可以并且 从非主 UI 线程调用。检查 InvokeRequired 的责任很可能应该由调用者承担,而不是方法。同样,无法从发布的代码中分辨出来。

关于c# - 不一致 "Cross-thread operation not valid"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34786648/

相关文章:

c# - .NET 调整大小事件 : Get old size?

c# - Xamarin - 我如何在类外使用列表

c# - 抽象类可以包含公共(public)方法吗?

c++ - 控制帧率

java - 如何等待一段时间,然后才返回默认值?

c# - CaSTLe Windsor 与静态方法

c# - 是否可以从代码中生成卫星程序集?

.net - 使用网络摄像头在WP7仿真器中模拟手机摄像头

java - JMeter自定义采样器同步

c# - 使用tasks和ContinueWith来实现调度器