場景 在Winform中拖拽 一個BackgroundWorker控制項,配合進度條控制項能開啟一個後臺線程並報告進度條進度。 但是在執行後臺線程的任務時,如果想要取消,怎樣讓其停止執行。 註: 博客主頁: https://blog.csdn.net/badao_liumang_qizhi 關註公眾號 ...
場景
在Winform中拖拽 一個BackgroundWorker控制項,配合進度條控制項能開啟一個後臺線程並報告進度條進度。
但是在執行後臺線程的任務時,如果想要取消,怎樣讓其停止執行。
註:
博客主頁:
https://blog.csdn.net/badao_liumang_qizhi
關註公眾號
霸道的程式猿
獲取編程相關電子書、教程推送與免費下載。
實現
設置可取消為true
將BackgroundWorker控制項的WorkerSupportsCancellation屬性設置為true。
這裡是直接通過控制項設置屬性的方式,如果是直接聲明的對象,則可以通過對象.屬性去設置。
如果不設置則會提示:此BackgroundWorker聲明它不支持取消。。。
發起取消後臺操作的請求
在上面允許取消後,在取消按鈕的點擊事件中發起取消後臺操作的請求。
this.backgroundWorker1.CancelAsync();
完整示例代碼
private void btnCancel_Click(object sender, EventArgs e) { this.backgroundWorker1.CancelAsync(); this.DialogResult = DialogResult.Cancel; this.Close(); }
真正取消後臺操作
上面發起取消後臺操作的請求後,並不會真正關閉後臺進程,只是報告要取消後臺進程。
如果要執行的操作是一個迴圈則會一直迴圈完。
在進行後臺具體執行的操作時是這樣綁定的
this.backgroundWorker1.DoWork += backgroundWorker1_DoWork; //觸發事件 this.backgroundWorker1.RunWorkerAsync();
所以要在具體執行後臺操作的方法 backgroundWorker1_DoWork中去進行判斷並終止
在上面進行請求取消操作後,那麼BackgroundWorker對象的CancellationPending屬性就為true。
所以在具體執行後臺操作的方法中的迴圈操作中
BackgroundWorker bgWorker = sender as BackgroundWorker; if ((bgWorker.CancellationPending == true)) { e.Cancel = true; errMsg = "已取消導出"; return false; } if (e.Cancel) { errMsg = "已取消導出"; return false; }