当前位置:  开发笔记 > 编程语言 > 正文

为什么我收到此错误:"跨线程操作无效:控制从其创建的线程以外的线程访问的lbFolders."?

如何解决《为什么我收到此错误:"跨线程操作无效:控制从其创建的线程以外的线程访问的lbFolders."?》经验,为你挑选了2个好方法。

这让我感到困惑,也许有人可以用我的无知来照亮教育之光.这是在C#windows应用程序中.我从一个线程访问列表框的内容.当我尝试像这样访问它

prgAll.Maximum = lbFolders.SelectedItems.Count;
我收到了错误.但是,这是我没有得到的部分.如果我注释掉那一行,那就是下一行
foreach (string dir in lbFolders.SelectedItems)
执行得很好.

编辑:像往常一样,我缺乏沟通技巧.让我澄清一下.

我知道从除了创建它们之外的线程访问GUI项会导致问题.我知道访问它们的正确方法是通过委托.

我的问题主要在于:为什么我可以正常访问和迭代SelectedItems对象,但是当我尝试获取(未设置)它的Count属性时,它会爆炸.



1> Echostorm..:

您无法从单独的线程访问GUI元素.使用委托进行更改.

例如.

lblStatus.Invoke((Action)(() => lblStatus.Text = counter.ToString()));

或更旧的skool:

lblTest.Invoke((MethodInvoker)(delegate() 
{ 
  lblTest.Text = i.ToString(); 
}));

我在这里发布了一篇关于如何在所有.Net版本中执行此操作的博客文章.



2> arul..:
prgAll.Maximum = lbFolders.SelectedItems.Count;

在该行上执行赋值(set/add),默认情况下不是线程安全的.

在第二行,它只是一个get操作,其中线程安全无关紧要.

编辑:我不是指访问prgAll元素.

访问Count属性会更改 ListBox内部集合的内部状态,这就是它抛出异常的原因.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有