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
}
}
为什么我在尝试阅读 ListView 时会收到此消息?我认为跨线程异常是在您尝试从单独的线程更新控件时发生的。
为什么我也没有得到这个异常?
最佳答案
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/