丽水集团网站建设,商城网站建设好么,杭州建设网杭州建设工程招标平台,慈利网站建设在编程中经常会遇到在一个按钮中执行复杂操作#xff0c;并将复杂操作最后返回的值加入一个ListView或ComboBox中候选。这个时候程序会卡#xff0c;当程序员将这些卡代码放进线程(Thread)中后发现当对控件操作时出现“线程间操作无效: 从不是创建控件的线程访问它”异常。 …在编程中经常会遇到在一个按钮中执行复杂操作并将复杂操作最后返回的值加入一个ListView或ComboBox中候选。这个时候程序会卡当程序员将这些卡代码放进线程(Thread)中后发现当对控件操作时出现“线程间操作无效: 从不是创建控件的线程访问它”异常。 为什么.net不让我们跨线程操作控件这是有好处的。因为如果你的线程多了那么当两个线程同时尝试将一个控件变为自己需要的状态时线程的死锁就会发生。但是难道就是因为这个原因我们就只能让程序卡着么当然不是这里教大家一个解决方案用BackGroundWorker 这里通过一个实例来告诉大家BackGroundWorker的用法。 首先我们先定义一个BackGroundWorker大家可以去面板上拖一个也可以自己手工定义一个。 this.backgroundWorker_Combo new System.ComponentModel.BackgroundWorker();//定义一个backGroundWorker
this.backgroundWorker_Combo.WorkerSupportsCancellation true;//设置能否取消任务this.backgroundWorker_Combo.DoWork new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker_Combo_DoWork);//让backgroundWorker做的事
this.backgroundWorker_Combo.RunWorkerCompleted new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker_Combo_RunWorkerCompleted);//当backgroundWorker做完后发生的事件如果是从面板上拖的那么请在DoWork事件上双击添加那些你想在背景线程中执行的代码也就是那些可能会让你卡的代码。 然后再在RunWorkerCompleted事件上双击添加那些你想往控件里操作的代码。 这里有一个开发实例讲的是实现类似Google搜索中下拉列表的实现。其思路是在DoWork中搜索数据库在Completed中将搜出来的东西放进去。 本文需要一个backgroundWorker一个ComboBox控件 static char x;/**//**//** summary/// 接受从DLL搜出来的项目/// /summaryprivate string[] global_ListItem;private void backgroundWorker_Combo_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){//如果数组中有东西那么加入ComboBoxif (global_ListItem.Length0){this.comboBox_App.Items.Clear();this.comboBox_App.Items.AddRange(global_ListItem);}}private void backgroundWorker_Combo_DoWork(object sender, DoWorkEventArgs e){global_ListItem Form_Setting.Global_DBC.SimilarFilter(x); //这是一个DLL中的方法用于查找所有以X打头的项目并放入一个数组中}private void comboBox_App_TextChanged(object sender, EventArgs e){//当用户键入一个字母时去数据库查ComboBox cb sender as ComboBox;if (cb.Text.Length1){x cb.Text[0];this.backgroundWorker_Combo.RunWorkerAsync();}}