BackGroundWorker用法
在編程中經常會遇到在一個按鈕中執行復雜操作,并將復雜操作最后返回的值加入一個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搜出來的項目/// </summary>private string[] global_ListItem;private void backgroundWorker_Combo_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){//如果數組中有東西,那么加入ComboBoxif (global_ListItem.Length>0){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.Length==1){x = cb.Text[0];this.backgroundWorker_Combo.RunWorkerAsync();}}
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的BackGroundWorker用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 经验:Windows To Go准备工作
- 下一篇: Exchange企业实战技巧(26)在O