BackgroundWorker使用方法樣例介紹 C#
阿新 • • 發佈:2019-01-04
BackgroundWorker使用方法:
取消是預設就支援的,而暫停則預設不支援。但通過ManualResetEvent可以對其進行干預
關鍵程式碼:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace WindowsFormsApplication1 { /// <summary> /// QQ 458978 無名 C#開發技術 歡迎和我交流探討 /// </summary> public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled) MessageBox.Show("使用者取消了操作"); else { MessageBox.Show("正常完成了操作"); } } //執行緒狀態物件,這裡是關鍵 private ManualResetEvent manualReset = new ManualResetEvent(true); private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { for (int i = 0; i < 100; i++) { if (backgroundWorker1.CancellationPending)//如果使用者申請取消 { for (int k = i; k >= 0; k--) { Thread.Sleep(10); backgroundWorker1.ReportProgress(k);//模擬一個回滾的效果 } e.Cancel = true; return; } //執行緒狀態物件,這裡是關鍵 manualReset.WaitOne();//如果ManualResetEvent的初始化為終止狀態(true),那麼該方法將一直工作,直到收到Reset訊號。然後,直到收到Set訊號,就繼續工作。 //反之亦然 Thread.Sleep(500); backgroundWorker1.ReportProgress(i + 1); } } //啟動 private void button1_Click(object sender, EventArgs e) { backgroundWorker1.RunWorkerAsync(); } //取消,停止 private void button2_Click(object sender, EventArgs e) { backgroundWorker1.CancelAsync(); } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage; this.label1.Text =e.ProgressPercentage.ToString (); } //暫停,繼續 private void button3_Click(object sender, EventArgs e) { if (button3.Text == "暫停") { //執行緒狀態物件,這裡是關鍵 manualReset.Reset();//暫停當前執行緒的工作,發訊號給waitOne方法,阻塞 button3.Text = "繼續"; } else { //執行緒狀態物件,這裡是關鍵 manualReset.Set();//繼續某個執行緒的工作 button3.Text = "暫停"; } } } }