这让我感到困惑,也许有人可以因我的无知而闪耀教育的光芒。这是在C#Windows应用程序中。我正在从线程访问列表框的内容。当我尝试像
prgAll.Maximum = lbFolders.SelectedItems.Count;
一样访问它时我得到了错误。但是,这是我没有得到的部分。如果我注释掉该行,则下一行
foreach (string dir in lbFolders.SelectedItems)
执行得很好。编辑:
和往常一样,我缺乏沟通能力。让我澄清一下。
我知道从不是在其上创建线程的线程访问GUI项会导致问题。我知道通过代理访问它们的正确方法。
我的问题主要是这样的:
为什么我可以很好地访问并遍历SelectedItems对象,但是当我尝试获取(未设置)该对象的Count属性时,它就爆炸了。
最佳答案
prgAll.Maximum = lbFolders.SelectedItems.Count;
在该行上,您将执行一个分配( set/add ),默认情况下这不是线程安全的。
在第二行中,这只是一个 get 操作,其中线程安全性无关紧要。
编辑:我的意思不是访问prgAll元素。
访问Count属性会更改ListBox内部集合的内部状态,这就是为什么它引发异常的原因。
关于c# - 为什么会出现此错误:“Cross-thread operation not valid: Control lbFolders accessed from a thread other than the thread it was created on.”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/244591/