先交代下我的情况:我的form上有一个datagridview,下面有一个ToolStrip,ToolStrip上有个StatusLabel,交代完毕了。
我有个线程是访问这statusLabel的,但是报错说是,非创建datagridview的线程,不能访问下面这句代码:
statusLabel.Text = thisKeywordCount + "/" + totalCount; 是debug直接定位到了这行的。
很奇怪啊,我在更新的是statusLabel怎么报错说非创建datagridview的线程呢,我又访问的不是datagridview,高手看看会是啥情况导致这个的呢
我有个线程是访问这statusLabel的,但是报错说是,非创建datagridview的线程,不能访问下面这句代码:
statusLabel.Text = thisKeywordCount + "/" + totalCount; 是debug直接定位到了这行的。
很奇怪啊,我在更新的是statusLabel怎么报错说非创建datagridview的线程呢,我又访问的不是datagridview,高手看看会是啥情况导致这个的呢
没弄明白,datagridview是控件,StatusLabel就不是控件了吗?
算控件,我的问题中能沾上边的起码是这样子的,首先它要继承controlls类,然后才算是组件类。才会出现那样的类似问题,statuslabel不算的。再说,我代码中操作的是StatusLabel,而给出的是非创建gridview的线程是不能访问,它明显把这个StatusLabel当作是了gridview了。。
System.Windows.Forms中ToolStripItem继承链上的控件并不具有后向兼容性,因此以上code pattern对此类控件不适用;可以将以上code pattern改为如下具体原理待高手解释了。
ThreadStart start = new ThreadStart(Check);
-----------------------------------------
check为方法名但是在线程里面不要加()
还是不要加的好 记得有人说过这个方法相当于把所有控件释放 无论哪个线程都可以用了 肯定不稳定了!
感觉还是.Invork比较好 但是处理比较复杂。
真不能太纠结于报错,有时候还真是莫名其妙的信息!
你不需要在StatusLabel上去找Invoke,在GridView甚至Form上都可以用Invoke执行你的设置StatusLabel的那个方法。不是非得去写StatusLabel.Invoke。
2 用户线程和UI线程的区别,建议你去了解下,然后你就知道问题原因了。不要为了解决问题而解决。这个问题在C++ C# 都一样,你不了解,随便你写什么代码都会出问题。
3 statusLabel 肯定不用再你线程改的。看这个帖子就知道怎么办
http://topic.csdn.net/u/20110825/23/704f7f2a-6e9b-427c-8277-75ba80954594.html
不是因为你访问的控件不是你创建的(当然,实际上的确不是你创建的)。实际上是控件都是UI线程创建的,你创建的用户线程(也可以叫非UI线程)无论如何都不该直接修改控件属性。
C#用委托方式处理。C++是消息方式处理。最后都是把操作放到UI线程上为目的。