服务热线:0512-53835727 | 帮助中心 | 域名主机 | 企业邮箱 | 关于我们 
欢迎你来到泽网 [请登陆] [免费注册] [泽网微博
产品资讯: 泽网6年太仓网站建设经验>>点击查看资质
新闻中心
联系方式
售前咨询:13812657908
售后服务:0512-53835727
公司传真:0512-82175107
泽网业务:点击这里给我发消息
网站优化:点击这里给我发消息
选择泽网的7大理由
1.泽网有6年的太仓网站设计和营销从业经验给予你专业的指导和意见.
2.我们合作于中国顶尖的域名服务商中国万网和中国新网域名任你选择。
3.中国国家级机房稳定快速保证你的网站畅游在电子营销的市场中遨游。
4.针对个人或者企业进入互联网,泽网给予客户最精准的把关和指导。
5.泽网编程全部按照W3C的标准进行设计考虑浏览器长远升级的兼容性。
6.泽网客服12小时在线,针对维护的项目小问题次日即可给予解决,大问题也可以在线实时沟通。
7.泽网本着惠泽企业共赢你我的原则我为人人人人为我,送人玫瑰手留余香客户赚到钱我们的使命。

线程间操作无效: 从不是创建控件“listBox1”的线程访问它

发布时间:2011年08月08日 作者:zewww 来源:泽网互联 浏览次数:
         分享到: 更多

如果代码是在VS2003中的话应该不会抛出这个异常,只有在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常。这是微软为了保证线程安全以及提高代码的效率所做的改进.
以前在VS2003中,我们通常都会忽略这种问题的存在,无限制的使用线程来完成一些工作,但是当系统慢慢变大的时候,这种滥用的线程不但没有提高我们的效率,反而使我们找错误的效率以及系统的复杂度大大的增加了。
微软的这一改动可以让我们在使用线程的时候,充分考虑一下线程的安全以及线程的使用规范,这样会有益于我们做出健壮的程序。
坚决这种跨线程的问题在VS2005中提供了两种简单的方法(我个人当前所了解的只有这两种):
一种是通过设置System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;(winform下)如果在你的程序初始化的时候设置了这个属性,而且在你的控件中使用的都是微软Framework类库中的控件的话,系统就不会再抛出你上面所说的这个错误了。当然这只是为了将VS2003的代码转换到VS2005下所使用的一种常见的方法。不建议采用。

第二种方法就是微软建议采用的跨线程调用的一种通用方法,就是使用代理来实现,就是将你所要操作的代码放到一个代理种,然后将这个代理交给创建这个控件的线程来执行你的代码。例如:
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种使用线程操作控件的时候都利用第二种方法来实现,如果嫌麻烦,也可以将这些控件利用继承的方式在父类里面实现这些代理方式的修改。
 

服务项目

域名注册
虚拟主机
企业邮箱
网站建设
网站优化
TQ客服软件
400电话

支付方式

在线支付(推荐)
银行电汇
到我公司付款
上门收费
支票付费

常用管理后台

万网域名自助管理
新网域名自助管理
万网主机控制面板
新网主机控制面板
独享主机管理平台
万网代备案系统

常见问题

如何进行域名解析
如何主机备案
如何申请发票
如何查询积分
如何使用FlashFXP

服务与支持

售前咨询:13812657908
售后服务:0512-53835727
泽网业务QQ:100331079
网站优化QQ:240095979
网站技术QQ:547816183
泽网服务于江苏上海等地区-惠泽企业共赢你我 服务网络:太仓 昆山 常熟 上海 吴江 张家港 无锡 徐州 睢宁 总部办公地址:太仓市北京东路88号太仓软件园东B幢3层
旗下站:泽网设计 西部数码代理 中国稳网核心代理 万网分销 华夏名网分销 美橙互联代理 新网核心代理 苏州邮箱网 备案编号:苏ICP备18043429号-7

友情链接