这让我感到困惑,也许有人可以因我的无知而闪耀教育的光芒。这是在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/

10-16 08:29