c# 线程间操作无效: 从不是创建控件“0”的线程访问它
来源:互联网 发布:手机编写c语言 编辑:程序博客网 时间:2024/06/10 01:03
如果代码是在VS2003中的话应该不会抛出这个异常,只有在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常。这是微软为了保证线程安全以及提高代码的效率所做的改进.
以前在VS2003中,我们通常都会忽略这种问题的存在,无限制的使用线程来完成一些工作,但是当系统慢慢变大的时候,这种滥用的线程不但没有提高我们的效率,反而使我们找错误的效率以及系统的复杂度大大的增加了。
微软的这一改动可以让我们在使用线程的时候,充分考虑一下线程的安全以及线程的使用规范,这样会有益于我们做出健壮的程序。
坚决这种跨线程的问题在VS2005中提供了两种简单的方法(我个人当前所了解的只有这两种):
一种是通过设置System.Windows.Forms.Control.CheckForIllegalCrossThre
第二种方法就是微软建议采用的跨线程调用的一种通用方法,就是使用代理来实现,就是将你所要操作的代码放到一个代理种,然后将这个代理交给创建这个控件的线程来执行你的代码。例如:
private void Form1_Load(object sender, EventArgs e)
{
//创建线程 需要System.Threading命名空间
Thread t1, t2; // 说明为窗体类成员
t1 = new Thread(new ThreadStart(BackgroundProcess));
t1.Start(); //启动线程t1
}
/// <summary>
/// 定义一个代理
/// </summary>
private delegate void dd();
private void BackgroundProcess()
{
// 将代理实例化为一个匿名代理
dd = delegate()
{
int i = 1;
while (true)
{
// 向列表框增加一个项目
listBox1.Items.Add("Iterations: " + i.ToString());
i++;
Thread.Sleep(2000); // 指定线程休眠的时间
}
};
listBox1.Invoke(dd);
}
上面这个代码只是在你的代码中声明了一个代 理,并且用VS2005中新加的语法(匿名代理,又名匿名方法。)来实例话这个代理,将你在线程中要操作的代码都放到这个匿名的方法中去。然后通过使用控 件的Invoke方法(也可以使用控件的BeginInvoke方法——Invoke方法是同步的BeginInvoke方法是异步的)来调用这个代理。 当然在Invoke方法中你也可以输入任何形式的代理。通过这种方式调用的代码就不会抛出你出现的那个异常了。
上面这种代理的方式类似于C++中的回调函数,你写出了执行的方法,然后通知某个线程由那个线程来调用你的这个方法,这样就做到了在固定的线程里执行修改线程内部组件的方式。这样就完全达到线程安全了。
另外,如果你使用的不是.NET类库中的控件 的话,最好不要使用第一种方式,因为某些第三方控件在线程安全性方面做的不是太好,可能还会抛出一些不可预料的异常。例如DevExpress控件库一般 会抛出对象引用为空的异常。所以建议所有在VS2005种使用线程操作控件的时候都利用第二种方法来实现,如果嫌麻烦,也可以将这些控件利用继承的方式在 父类里面实现这些代理方式的修改
- c# 线程间操作无效: 从不是创建控件“0”的线程访问它
- c#线程问题:线程间操作无效:从不是创建控件 的线程访问它
- C# 线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~
- c#关于“线程间操作无效: 从不是创建控件的线程访问它”的问题
- c# 线程间操作无效: 从不是创建控件“FormMain”的线程访问它
- C#多线程问题:线程间操作无效: 从不是创建控件“label4”的线程访问它
- BackGroundWorker解决“线程间操作无效: 从不是创建控件的线程访问它” (C# VS2008)
- C#线程间操作无效: 从不是创建控件" XX" 的线程访问它
- 线程间操作无效: 从不是创建控件“label1”的线程访问它。C#定时器
- C#线程间操作无效: 从不是创建控件" XX" 的线程访问它
- c# 线程间操作无效,从不是创建控件的线程访问了它
- c# 线程间操作无效: 从不是创建控件“textBox1”的线程访问它。解决方法
- 【转】C#线程间操作无效: 从不是创建控件" XX" 的线程访问它
- C#中线程间操作无效: 从不是创建控件 txtBOX 的线程访问它。
- C#错误---线程间操作无效: 从不是创建控件"Form1"的线程访问它.
- C# 线程间操作无效: 从不是创建控件“receivemsg”的线程访问它。
- C#线程间操作无效: 从不是创建控件" XX" 的线程访问它
- C#中线程间操作无效: 从不是创建控件 txtBOX 的线程访问它
- LOAD DATA
- 自动工作负载库(Automatic Workload Repository,AWR)
- C/C++中extern关键字详解
- 如何设置网页打开时自动执行某个javascript程序?
- 有用的正则验证,转自互联网
- c# 线程间操作无效: 从不是创建控件“0”的线程访问它
- python模块介绍- xlwt 创建xls文件(excel)
- java 判断字符串能否转化为数字的三种方法
- C/C++中static关键字详解
- 一路走来,遇到的问题
- 常用快捷键
- LINUX消息队列编程(整理融合版)
- 傻瓜式快速搭建PHP开发环境:介绍几款AMP套装
- C# 使用Windows窗体的命名空间