C# - 異步編程 - BackgroundWorker 類
后臺線程,BackgroundWorker 類用于創建一個線程,在后臺持續運行以完成某項工作,并不時地與主線程通信。
BackgroundWorker 類的屬性,方法與事件。
屬性:
WorkerReportsProgress:設置后臺任務是否可以把它的進度匯報給主線程。WorkerSupportsCancellation:是否支持從主線程取消。IsBusy:檢查后臺任務是否正在運行。CancellationPending:每隔一段時間會檢查該屬性是否停止處理。
事件:
DoWork- 在后臺線程開始時觸發。ProgressChanged- 后臺任務匯報進度時觸發。RunWorkerCompleted- 后臺工作線程退出時觸發。
方法:
RunWorkerAsync()- 獲取后臺線程并執行 DoWork 事件處理程序。CancelAsync()- 設置CancellationPending屬性為true。DoWork()- 事件處理程序希望向主線程序匯報進度的時候,調用 ReportProgress 方法。
1 namespace WpfApp1 2 { 3 /// <summary> 4 /// MainWindow.xaml 的交互邏輯 5 /// </summary> 6 public partial class MainWindow : Window 7 { 8 BackgroundWorker bgWorker = new BackgroundWorker(); 9 public MainWindow() 10 { 11 InitializeComponent(); 12 // 初始化 13 bgWorker.WorkerReportsProgress = true; 14 bgWorker.WorkerSupportsCancellation = true; 15 16 // 事件注冊 17 bgWorker.DoWork += DoWork_Handler; 18 bgWorker.ProgressChanged += ProgressChanged_Handler; 19 bgWorker.RunWorkerCompleted += RunWorkerCompleted_Handler; 20 } 21 22 private void RunWorkerCompleted_Handler(object sender, RunWorkerCompletedEventArgs e) 23 { 24 progressBar.Value = 0; 25 if (e.Cancelled) 26 MessageBox.Show("Process was cancelled.", "Process Cancelled"); 27 else 28 MessageBox.Show("Process completed normally.", "Process Completed"); 29 } 30 31 private void ProgressChanged_Handler(object sender, ProgressChangedEventArgs e) 32 { 33 // 設置進度條值 34 progressBar.Value = e.ProgressPercentage; 35 } 36 37 private void DoWork_Handler(object sender, DoWorkEventArgs e) 38 { 39 BackgroundWorker worker = sender as BackgroundWorker; 40 41 for (int i = 0; i <= 10; i++) 42 { 43 // 循環判斷 CancellationPending 是否為true。 44 if (worker.CancellationPending) 45 { 46 e.Cancel = true; 47 break; 48 } 49 else 50 { 51 // 觸發主線程 ProgressChanged 52 worker.ReportProgress(i * 10); 53 Thread.Sleep(250); 54 } 55 56 } 57 } 58 59 private async void btnProcess_Click(object sender, RoutedEventArgs e) 60 { 61 // 判斷當前后臺線程是否運行 62 if (!bgWorker.IsBusy) 63 // 調用方法啟動后臺線程,并觸發 DoWork 事件 64 bgWorker.RunWorkerAsync(); 65 } 66 67 private void btnCancel_Click(object sender, RoutedEventArgs e) 68 { 69 // 設置對象 CancelltionPending 為true; 70 bgWorker.CancelAsync(); 71 } 72 } 73 }

浙公網安備 33010602011771號