
教你如何解决“线程间操作无效: 从不是创建控件的线程访问它”
1个回答
展开全部
这个时候程序会卡,当程序员将这些卡代码放进线程(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();}}
线程间操作无效: 从不是创建控件的线程访问它
,建议大家看看这篇文章:
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询