這篇文章主要介紹了winform多線程組件BackgroundWorker怎么使用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇winform多線程組件BackgroundWorker怎么使用文章都會有所收獲,下面我們一起來看看吧。
BackgroundWorker是·net里用來執行多線程任務的控件,它允許編程者在一個單獨的線程上執行一些操作。
可以通過編程方式創建 BackgroundWorker,也可以將它從“工具箱”的“組件”選項卡中拖到窗體上。 如果在 Windows 窗體設計器中創建 BackgroundWorker,則它會出現在組件欄中,而且它的屬性會顯示在“屬性”窗口中。
RunWorkerAsync 開始執行后臺操作。引發 DoWork 事件。
public void RunWorkerAsync(); //啟動線程,觸發DoWork事件
public void RunWorkerAsync(object argument);
CancelAsync 請求取消掛起的后臺操作。
注意:這個方法是將 CancellationPending 屬性設置為 true,并不會終止后臺操作。在后臺操作中要檢查CancellationPending 屬性,來決定是否要繼續執行耗時的操作。
ReportProgress引發 ProgressChanged 事件。
public void ReportProgress(int percentProgress); //報告進度,觸發ProgressChanged事件
public void ReportProgress(int percentProgress, object userState);
IsBusy: //只讀屬性,用來判斷當前線程是否正在工作中。
CancellationPending: 指示應用程序是否已請求取消后臺操作。只讀屬性,默認為 false,當執行了 CancelAsync 方法后,值為 true。
WorkerSupportsCancellation:指示是否支持異步取消。要執行 CancelAsync 方法,需要先設置該屬性為 true。
WorkerReportsProgress:指示是否能報告進度。要執行 ReportProgress 方法,需要先設置該屬性為 true。
DoWork: 調用 RunWorkerAsync 方法時發生。
ProgressChanged:可選,調用 ReportProgress 方法時發生。
RunWorkerCompleted:可選,后臺操作已完成、被取消或引發異常時發生。
注意:在 DoWork 事件處理程序中不操作任何用戶界面對象。而應該通過 ProgressChanged 和RunWorkerCompleted 事件與用戶界面進行通信。
如果想在 DoWork 事件處理程序中和用戶界面的控件通信,可在用 ReportProgress 方法。ReportProgress(int percentProgress, object userState),可以傳遞一個對象。ProgressChanged 事件可以從參數ProgressChangedEventArgs 類的UserState 屬性得到這個信息對象。這個事件也可以實現進度條功能,把任務的進度實時呈現給用戶。
簡單的程序用BackgroundWorker 比 Thread 方便,Thread中和用戶界面上的控件通信比較麻煩,需要用委托來調用控件的 Invoke 或BeginInvoke 方法,沒有 BackgroundWorker 方便。
新建BackgroundWorder對象;
根據需求, 設置是否能取消(WorkerSupportsCancellation)、是否報告進度(WorkerReportsProgress);
根據需求,設置好相關事件,DoWorker、ProgressChanged、ProgressChanged;
調用RunWorkerAsyns()方法,啟動線程;
在需要取消的位置,判斷CancellationPending的值,并做相關處理;//可選
在適當的位置調用ReportProgress(int percentProgress)方法,報告進度。
public partial class Form1 : Form { public Form1() { InitializeComponent(); backgroundWorker1.WorkerReportsProgress = true;//報告完成進度 backgroundWorker1.WorkerSupportsCancellation = true;//允許用戶終止后臺線程 //綁定事件 backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork); backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); } //開始按鈕 private void button1_Click(object sender, EventArgs e) { if (!backgroundWorker1.IsBusy)//判斷backgroundWorker1是否正在運行異步操作 { backgroundWorker1.RunWorkerAsync(1000);//開始執行后臺異步操作,調用DoWork事件 } while (backgroundWorker1.IsBusy)//等待后臺運行完畢 { Application.DoEvents(); } MessageBox.Show("操作完成"); } //取消按鈕 private void button2_Click(object sender, EventArgs e) { if (backgroundWorker1.WorkerSupportsCancellation == true) { backgroundWorker1.CancelAsync();//取消后臺操作 backgroundWorker1.Dispose();//釋放資源 } } //DoWork事件聲明要執行的耗時操作 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker backgroundWorker = sender as BackgroundWorker; e.Result = ListNumber(backgroundWorker, e);//運算結果保存在e.Result中(在RunWorkerCompleted事件可能會使用到) } bool ListNumber(object sender, DoWorkEventArgs e) { int num = (int)e.Argument;//接收傳入的參數,即RunWorkerAsync(object argument)傳入的值 for (int i = 1; i <= num; i++) { if (backgroundWorker1.CancellationPending)//判斷是否請求了取消后臺操作,如果為false則退出 { e.Cancel = true;//e.Cancel 是否應該取消事件 return false; } Thread.Sleep(10);//執行一個耗時操作 backgroundWorker1.ReportProgress(i * 100 / num, i);//報告完成進度 } return true; } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage;//將完成進度數據傳給進度條 label1.Text = e.ProgressPercentage + "%"; //將中間計算結果在ListBox控件中顯示出來 listBox1.Items.Add(e.UserState);//接收ReportProgress方法傳遞過來的userState } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled == true) //e.Cancelled指示異步操作是否已被取消 { MessageBox.Show("Canceled!"); } else if (e.Error != null) //e.Error 指示異步操作期間發生的錯誤 { MessageBox.Show("Error: " + e.Error.Message); } else { MessageBox.Show(e.Result.ToString()); //e.Result 獲取異步操作結果的值,即DoWork事件中,Result設置的值。 } } }
(WinForm中實現多線程的首選方法是backgroundWorker)
Thread thread = new Thread(SetLabel);//另開一個線程上設置Label的屬性 thread.Start(); delegate void Action(string args);//Net3.5自帶的Action無參數無返回值 private void SetLabel() { Action action = delegate (string args) { this.label1.Text = args; }; if (this.InvokeRequired)//判斷當前代碼是運行于創建該控件的線程之上,還是運行于另一個線程之上。 this.Invoke(action, "XXX");//注意控件的Inovoke和BeginInvoke委托的方法都執行在UI線程上。對Control的Invoke方法可以使用一個簡單的系統委托MethodInvoker無參數返回Void調用。 else action("XXX"); }
關于“winform多線程組件BackgroundWorker怎么使用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“winform多線程組件BackgroundWorker怎么使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。