教你如何解决“线程间操作无效: 从不是创建控件的线程访问它”

涋橩澽
2013-10-11 · TA获得超过4682个赞
知道大有可为答主
回答量:1144
采纳率:0%
帮助的人:1006万
展开全部
这个时候程序会卡,当程序员将这些卡代码放进线程(Thread)中后发现当对控件操作时出现 线程间操作无效: 从不是创建控件的线程访问它异常。 这里通过一个实例来告诉大家BackGroundWorker的用法。 首先我们先定义一个BackGroundWorker,大家可以去面板上拖一个,也可以自己手工定义一个。 this .backgroundWorker_Combo=newSystem.ComponentModel.BackgroundWorker();//定义一个backGroundWorkerthis .backgroundWorker_Combo.WorkerSupportsCancellation=true;//设置能否取消任务this .backgroundWorker_Combo.DoWork+=newSystem.ComponentModel.DoWorkEventHandler(this .backgroundWorker_Combo_DoWork);//让backgroundWorker做的事this .backgroundWorker_Combo.RunWorkerCompleted+=newSystem.ComponentModel.RunWorkerCompletedEventHandler(this .backgroundWorker_Combo_RunWorkerCompleted);//当backgroundWorker做完后发生的事件 如果是从面板上拖的,那么请在DoWork事件上双击,添加那些你想在背景线程中执行的代码,也就是那些可能会让你卡的代码。 然后再在RunWorkerCompleted事件上双击,添加那些你想往控件里操作的代码。 这里有一个开发实例,讲的是实现类似Google搜索中下拉列表的实现。其思路是在DoWork中搜索数据库,在Completed中将搜出来的东西放进去。 本文需要一个backgroundWorker,一个ComboBox控件staticcharx;/**//// <summary///接受从DLL搜出来的项目/// </summaryprivatestring[]global_ListItem;privatevoidbackgroundWorker_Combo_RunWorkerCompleted(objectsender,RunWorkerCompletedEventArgse){//如果数组中有东西,那么加入ComboBoxif(global_ListItem.Length0){this .comboBox_App.Items.Clear();this .comboBox_App.Items.AddRange(global_ListItem);}}privatevoidbackgroundWorker_Combo_DoWork(objectsender,DoWorkEventArgse){global_ListItem=Form_Setting.Global_DBC.SimilarFilter(x);//这是一个DLL中的方法,用于查找所有以X打头的项目,并放入一个数组中}privatevoidcomboBox_App_TextChanged(objectsender,EventArgse){//当用户键入一个字母时去数据库查ComboBoxcb=senderasComboBox;if(cb.Text.Length==1){x=cb.Text[0];this .backgroundWorker_Combo.RunWorkerAsync();}} 线程间操作无效: 从不是创建控件的线程访问它 ,建议大家看看这篇文章:
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式