C#线程之间操作无效|不允许访问控件(c# 线程间操作无效: 从不是创建控件“”的线程访问它)
2013-08-14 09:19
676 查看
解决方法
1.创建事件委托
c#不允许对跨线程的控件的访问,如需操作跨线程的操作需要通过委托(delegate),即是函数指针来操作跨线程。说明dgList控件不是该线程的控件,需要使用委托操作。比如:
delegate void SetListBoxCallback(string str); //定义委托(SetListBoxCallback名称可以变化,自己定义)
public void SetListBox(string str)
{
if (listBoxInfo.InvokeRequired) //控件是否跨线程?如果是,则执行括号里代码
{
SetListBoxCallback setListCallback = new SetListBoxCallback(SetListBox); //实例化委托对象
listBoxInfo.Invoke(setListCallback, str); //重新调用SetListBox函数(新创建的委托进行相应控件的操作
}
else //否则,即是本线程的控件,控件直接操作
{
listBoxInfo.Items.Add(str); //具体的控件操作。eg:textBox1.Text+=str;
}
}
在MSDN里面可以找到,关键字:线程安全
委托名可以自己定义,
(如果你直接执行,那么就是从子线程调用主线程的方法执行你的操作,这样是不允许的。
虽然没人告诉我这是为什么,但是我觉得(很多线程同时调用)那样可能会导致死锁的情况。
举例说,我是主线程,电脑是子线程,我能够控制子线程怎么操作,可是你能让电脑控制我吗?显然不能,也不可能。
那为什么引用就可以呢?引用是什么?
引用就是方法的别名,如果你打过游戏,可以理解这是方法的一个副本。
每个线程创建一个我的副本,那么就可以执行了,不会出现争抢,死锁的情况。)
一楼线程安全代码的解释是这样的:
定义一个委托
创建一个方法 //在需要线程操作的地方调用此方法
{
如果某一个操作需调用主线程的该方法
给他创建一个该方法的副本,调用该方法的副本执行操作
如果并没有调用主线程操作
直接执行【你需要的操作】 //在此你需要的操作即在主线程上进行的操作
}
2.创建线程(需要补全,实操未通过)
void XXXXXX()
{
ThreadStart X;
X= new ThreadStart(func); //将类的方法绑定X。
Thread Y=new Thread(Y); //创建新线程
Y.Start();//线程开始
}
void func(XXXXXXXXX) //类的一个方法
{
//对相应控件进行操作
}
ThreadStart是一个delegate
1.创建事件委托
c#不允许对跨线程的控件的访问,如需操作跨线程的操作需要通过委托(delegate),即是函数指针来操作跨线程。说明dgList控件不是该线程的控件,需要使用委托操作。比如:
delegate void SetListBoxCallback(string str); //定义委托(SetListBoxCallback名称可以变化,自己定义)
public void SetListBox(string str)
{
if (listBoxInfo.InvokeRequired) //控件是否跨线程?如果是,则执行括号里代码
{
SetListBoxCallback setListCallback = new SetListBoxCallback(SetListBox); //实例化委托对象
listBoxInfo.Invoke(setListCallback, str); //重新调用SetListBox函数(新创建的委托进行相应控件的操作
}
else //否则,即是本线程的控件,控件直接操作
{
listBoxInfo.Items.Add(str); //具体的控件操作。eg:textBox1.Text+=str;
}
}
在MSDN里面可以找到,关键字:线程安全
委托名可以自己定义,
(如果你直接执行,那么就是从子线程调用主线程的方法执行你的操作,这样是不允许的。
虽然没人告诉我这是为什么,但是我觉得(很多线程同时调用)那样可能会导致死锁的情况。
举例说,我是主线程,电脑是子线程,我能够控制子线程怎么操作,可是你能让电脑控制我吗?显然不能,也不可能。
那为什么引用就可以呢?引用是什么?
引用就是方法的别名,如果你打过游戏,可以理解这是方法的一个副本。
每个线程创建一个我的副本,那么就可以执行了,不会出现争抢,死锁的情况。)
一楼线程安全代码的解释是这样的:
定义一个委托
创建一个方法 //在需要线程操作的地方调用此方法
{
如果某一个操作需调用主线程的该方法
给他创建一个该方法的副本,调用该方法的副本执行操作
如果并没有调用主线程操作
直接执行【你需要的操作】 //在此你需要的操作即在主线程上进行的操作
}
2.创建线程(需要补全,实操未通过)
void XXXXXX()
{
ThreadStart X;
X= new ThreadStart(func); //将类的方法绑定X。
Thread Y=new Thread(Y); //创建新线程
Y.Start();//线程开始
}
void func(XXXXXXXXX) //类的一个方法
{
//对相应控件进行操作
}
ThreadStart是一个delegate
相关文章推荐
- c# 线程间操作无效,从不是创建控件的线程访问了它
- c# 线程间操作无效: 从不是创建控件“textBox1”的线程访问它。解决方法
- 4000 c#关于“线程间操作无效: 从不是创建控件的线程访问它”的问题
- C#---线程间操作无效: 从不是创建控件“txtreceive”的线程访问它
- c# 线程间操作无效: 从不是创建控件“”的线程访问它,用托管来解决
- C# 线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~
- C# 引发“线程间操作无效: 从不是创建控件“XXX”的线程访问它” 解决方法
- c#中Invoke使用方法(线程间操作无效: 从不是创建控件的线程访问它。那么创建它的线程是哪个线程?)
- C#线程间操作无效: 从不是创建控件" XX" 的线程访问它
- 黄聪:BackGroundWorker解决“线程间操作无效: 从不是创建控件的线程访问它” (C# VS2008)
- c#线程间操作无效: 从不是创建控件“textBox1”的线程访问它
- c# 线程间操作无效: 从不是创建控件“0”的线程访问它
- c#线程问题:线程间操作无效:从不是创建控件 的线程访问它InvalidOperationException异常
- 黄聪:C#“多线程线程间操作无效: 从不是创建控件的线程访问它。”,跨线程修改控件属性解决方案
- C# 线程间操作无效: 从不是创建控件的线程访问它
- BackGroundWorker解决“线程间操作无效: 从不是创建控件的线程访问它” (C# VS2008)
- C#线程间操作无效: 从不是创建控件" XX" 的线程访问它
- c#中使用多线程访问winform中控件的若干问题 解决线程间操作无效: 从不是创建控件的线程访问它
- C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它
- 【转】C#线程间操作无效: 从不是创建控件" XX" 的线程访问它