C# BackgroundWorker物件 非同步執行,避免介面卡死
阿新 • • 發佈:2019-02-06
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; namespace BackGroundWork { public partial class Form1 : Form { private BackgroundWorker m_BackgroundWorker;// 申明後臺物件 public Form1() { InitializeComponent(); m_BackgroundWorker = new BackgroundWorker(); // 例項化後臺物件 m_BackgroundWorker.WorkerReportsProgress = true; // 設定可以通告進度 m_BackgroundWorker.WorkerSupportsCancellation = true; // 設定可以取消 m_BackgroundWorker.DoWork += new DoWorkEventHandler(DoWork);//執行這個RunWorkerAsync()方法時執行 //呼叫BackgroundWorker bw = new BackgroundWorker();bw.ReportProgress(i++);呼叫這個方法時發生 m_BackgroundWorker.ProgressChanged += new ProgressChangedEventHandler(UpdateProgress); //當後臺執行完成 或被取消 或引發異常時發生 m_BackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompletedWork); m_BackgroundWorker.RunWorkerAsync(this); } /// <summary> /// BackgroundWorker執行的長時間方法 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void DoWork(object sender, DoWorkEventArgs e) { //也可以直接用這個m_BackgroundWorker申明的後臺物件 BackgroundWorker bw = sender as BackgroundWorker; int i = 0; while (i <= 100) { //判斷應用程式是否已請求取消後臺操作 if (bw.CancellationPending) { e.Cancel = true; break; } //注意 這裡呼叫ReportProgress(int) 方法時 會執行UpdateProgress()方法 bw.ReportProgress(i++); Thread.Sleep(1000); } } /// <summary> /// 實時更新進度的方法 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void UpdateProgress(object sender, ProgressChangedEventArgs e) { int progress = e.ProgressPercentage; label1.Text = string.Format("{0}", progress); } /// <summary> /// 事件執行完成的回撥方法 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void CompletedWork(object sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) { MessageBox.Show("Error");//發生錯誤 } else if (e.Cancelled) { MessageBox.Show("Canceled");//取消後臺 } else { MessageBox.Show("Completed");//完成 } } //請求取消後臺掛起的操作 private void button1_Click(object sender, EventArgs e) { m_BackgroundWorker.CancelAsync(); } } } /*BackgroundWorker傳遞引數*/ bw_DataInterface.DoWork += new DoWorkEventHandler(bw_DataInterface_DoWork); bw_DataInterface.RunWorkerAsync("Test parameters"); 在DoWork Func: DoWork(object sender, DoWorkEventArgs e) { string tt=e.Argument.ToString(); }