using System;using System.Collections.Generic;using System.ComponentModel;using System.Reflection;using System.Threading;using System.Windows.Forms;namespace BackgroundWorkerExplore{ public partial class Form1 : Form { public Form1() { Init
using System; using System.Collections.Generic; using System.ComponentModel; using System.Reflection; using System.Threading; using System.Windows.Forms; namespace BackgroundWorkerExplore { public partial class Form1 : Form { public Form1() { InitializeComponent(); } #region 异步处理 //002 private int RetrieveData(BackgroundWorker worker, DoWorkEventArgs e) { int max = (int)e.Argument; int percent = 0; for (int i = 1; i <= max; i++) { if (worker.CancellationPending) return i; percent = (int)(((double)i / (double)max) * 100); // 摘要: // 引发 System.ComponentModel.BackgroundWorker.ProgressChanged 事件。 // percentProgress: 已完成的后台操作所占的百分比,范围从 0% 到 100%。 // userState:/ 传递到 System.ComponentModel.BackgroundWorker.RunWorkerAsync(System.Object) 的状态对象。 worker.ReportProgress(percent, new KeyValuePair<int, string>(i, Guid.NewGuid().ToString())); Thread.Sleep(500); } return max; } //001 首先执行dowork private void bgworker_DoWork(object sender, DoWorkEventArgs e) { try { e.Result = RetrieveData(this.bgworker, e); } catch (Exception ex) { MessageBox.Show(ex.Message); throw; } } //003 private void bgworker_ProgressChanged(object sender, ProgressChangedEventArgs e) { KeyValuePair<int, string> record = (KeyValuePair<int, string>)e.UserState; //操作UI this.labelResultLeft.Text = string.Format("There are {0} records retrieved!", record.Key); this.progressBarLeft.Value = e.ProgressPercentage; this.lvLeft.Items.Add(record.Value); } //004所有操作执行完后执行 private void bgworker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { try { this.labelResultLeft.Text = string.Format("Total records: {0}", e.Result); this.btnStart.Enabled = true; this.btnStop.Enabled = false; } catch (TargetInvocationException ex) { MessageBox.Show(ex.InnerException.GetType().ToString()); } } #endregion private void btnStart_Click(object sender, EventArgs e) { if (this.bgworker.IsBusy) return; this.lvLeft.Items.Clear(); int MaxValue = 10; this.bgworker.RunWorkerAsync(MaxValue); this.btnStart.Enabled = false; this.btnStop.Enabled = true; } private void btnStop_Click(object sender, EventArgs e) { this.bgworker.CancelAsync(); } } }
运行效果: