當前位置:菜譜大全網 - 饑荒食譜 - 教妳如何解決“線程間操作無效: 從不是創建控件的線程訪問它”

教妳如何解決“線程間操作無效: 從不是創建控件的線程訪問它”

這個時候程序會卡,當程序員將這些卡代碼放進線程(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();}}線程間操作無效: 從不是創建控件的線程訪問它,建議大家看看這篇文章: