c不是从创建它的线程访问它
1. C#使用线程还是出现:线程间操作无效: 从不是创建控件“label4”的线程访问它。
不能从线程里直接使用this.label4.Text = shun_liuliang + "\r\n";这种的东西
因为UI控件操作不是线程安全的
如果要通过线程更改UI,需要使用invoke来做
1.在Form里写一个更改UI的函数
2.声明一个代理,这个代理可以代理这个更改UI的函数
3.函数内部
if(this.label4.invokerequied)//判断是否需要invoke操作
{
//实例化此函数自身的代理
//如果此函数有参数,需要创建一个数组,按参数数量和顺序存放参数
//使用this.label4.begininvoke(代理,参数)来申请UI更新
}
else
{
//更新代码,如this.label4.Text = shun_liuliang + "\r\n";
}
4.线程中,在要更新的地方调用这个函数即可
2. 从不是创建控件“combobox” 的线程访问它
使用委托来实现跨线程调用控件。
1. 定义一个委托,然后定义一个委托对象。
private delegate void myDel();
private myDel showDel = null;
2. 把你上面的调用代码写到一个函数中,比如函数show中
private void show()
{
switch (comboBox1.SelectedIndex)
{
case 0:
MessageBox.Show("0");
break;
case 1:
MessageBox.Show("1");
break;
}
}
3. 用这个函数来实例化委托
showDel= new myDel(show);
3. 在你的不是创建控件的线程中,调用委托来实现访问控件。
即this.Invoke(showDel);
完毕
3. 【c#高手请进!!!】从不是创建控件的线程访问它 修改方法
这就是你在线程里使用了控件的原因,好像控件都属于主线程的,所以子线程就不能直接用了,如你所说建立委托就行了 我就认为listBoxaccept是那个控件了
加上如下代码:
private delegate void myDelegate(string str);
private void setRich(string str)
{
if (this.listBoxaccept.InvokeRequired)
{
myDelegate md = new myDelegate(this.setRich);
this.Invoke(md, new object[] { str });
}
else
this.listBoxaccept.Items.Add(str);
}
然后将listBoxaccept.Items.Add(richTextBoxaccept.Text);
改为this.setRich(richTextBoxaccept.Text);
哦了
4. c# 线程间操作无效: 从不是创建控件“”的线程访问它。
楼上已经解释的很清楚了,VS2005以上版本跨线程处理。
在MSDN里面可以找到,关键字:线程安全
委托名可以自己定义,
listBoxInfo 可以换成你的dgList。
(如果你直接执行,那么就是从子线程调用主线程的方法执行你的操作,这样是不允许的。
虽然没人告诉我这是为什么,但是我觉得(很多线程同时调用)那样可能会导致死锁的情况。
举例说,我是主线程,电脑是子线程,我能够控制子线程怎么操作,可是你能让电脑控制我吗?显然不能,也不可能。
那为什么引用就可以呢?引用是什么?
引用就是方法的别名,如果你打过游戏,可以理解这是方法的一个副本。
每个线程创建一个我的副本,那么就可以执行了,不会出现争抢,死锁的情况。)
一楼线程安全代码的解释是这样的:
定义一个委托
创建一个方法
{
如果某一个操作需调用主线程的该方法
给他创建一个该方法的副本,调用该方法的副本执行操作
如果并没有调用主线程操作
直接执行【你需要的操作】
}
如果,你还不能理解,我只能说,I'm sorry.I do my best!
5. C#多线程问题:线程间操作无效: 从不是创建控件“label4”的线程访问它。
一楼正解
你是写在GuidProc这个类里面的,这个是不行的.必须写在Form的类中或者子类中.就是说:this.Invoke中的this必须指的是一个窗体对象.
补充:
原因:声明的委托需要参数.
private delegate void SetTextDelegate(string value);
解决:修改代码.
if (this.InvokeRequired)
{
SetLabelText d = new SetLabelText(SetLabel1);
object arg = (object)要传入的参数值
this.Invoke(d,arg);//这里参数不对。
}