BackgroundWorker: 1.定義:是.net里用來執行多線程任務的控制項,它允許編程者在一個單獨的線程上執行一些操作。 2.使用場景:耗時的操作(如下載和資料庫事務)長時間運行時可能會導致用戶界面 (UI) 始終處於停止響應狀態。如果我們需要能進行響應的用戶界面,而且面臨與這類操作相關的長 ...
BackgroundWorker:
1.定義:是.net里用來執行多線程任務的控制項,它允許編程者在一個單獨的線程上執行一些操作。
2.使用場景:耗時的操作(如下載和資料庫事務)長時間運行時可能會導致用戶界面 (UI) 始終處於停止響應狀態。如果我們需要能進行響應的用戶界面,而且面臨與這類操作相關的長時間延遲,則可以使用BackgroundWorker類方便地解決問題。
3.控制項簡介:有三個控制項
- DoWork: 在程式中調用RunWorkerAsync會啟動DoWork事件處理。
- ProgressChanged: 在事件處理過程中,調用ReportProgress方法則會啟動ProgressChanged事件的事件處理。
- RunWorkerCompleted: 當DoWork事件處理完成時,則會觸發RunWorkerCompleted事件。
- 註意:在DoWork事件處理程式中不操作任何用戶界面對象,否則會停止響應。應該通過ProgressChanged和RunWorkerCompleted事件與用戶界面進行通信。
4.示例:
1 using System; 2 using System.ComponentModel; 3 using System.Threading; 4 using System.Windows.Forms; 5 6 namespace bcworker 7 { 8 public partial class Form1 : Form 9 { 10 //後臺工作 11 private BackgroundWorker bw = new BackgroundWorker(); 12 13 public Form1() 14 { 15 InitializeComponent(); 16 //後臺工作初始化 17 bw.WorkerReportsProgress = true;//報告進度 18 bw.WorkerSupportsCancellation = true;//支持取消 19 bw.DoWork += new DoWorkEventHandler(bgWorker_DoWork);//開始工作 20 bw.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgessChanged);//進度改變事件 21 bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_WorkerCompleted);//進度完成事件 22 } 23 24 private void btnStart_Click(object sender, EventArgs e) 25 { 26 //後臺工作運行中,避免重入 27 if (bw.IsBusy) return; 28 bw.RunWorkerAsync("參數");//觸發DoWork事件並非同步執行,IsBusy置為True 29 } 30 //後臺工作將非同步執行 31 public void bgWorker_DoWork(object sender, DoWorkEventArgs e) 32 { 33 //(string)e.Argument == "參數"; 34 for (int i = 0; i <= 100; i++) 35 { 36 37 if (bw.CancellationPending) 38 {//用戶取消了工作 39 e.Cancel = true; 40 return; 41 } 42 else 43 { 44 bw.ReportProgress(i, "Working");//報告進度,觸發ProgressChanged事件 45 Thread.Sleep(10);//模擬工作 46 } 47 } 48 } 49 //進度改變事件 50 public void bgWorker_ProgessChanged(object sender, ProgressChangedEventArgs e) 51 { 52 //(string)e.UserState=="Working" 53 progressBar1.Value = e.ProgressPercentage;//取得進度更新控制項,不用Invoke了 54 } 55 //後臺工作執行完畢,IsBusy置為False 56 public void bgWorker_WorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 57 { 58 //e.Error == null 是否發生錯誤 59 //e.Cancelled 完成是由於取消還是正常完成 60 } 61 62 private void btnCancel_Click(object sender, EventArgs e) 63 { 64 if (bw.IsBusy) bw.CancelAsync();//設置CancellationPending屬性為True 65 } 66 67 } 68 } 69 ———————————————— 70 版權聲明:本文為CSDN博主「AAA張紹山」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。 71 原文鏈接:https://blog.csdn.net/donowtop/article/details/79839597