.NET-BackgroundWorker实现异步处理和滚动条报告进度Demo

xiaoxiao2021-02-28  96

基本API介绍 先创建一个BackgroundWorker

var worker= new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true, }; 搭载事件处理程序: worker.DoWork += BackgroundWorker_DoWork; BackgroundWorker_DoWork触发的条件:调用 BackgroundWorker.RunWorkerAsync() 时发生 private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e) { _process = 0; _doWorkEventArgs = e; switch (Status) { case -1: //错误 { //TODO:在此添加对于异常错误的处理代码 } break; case 0: //空闲 { Status = 1; //RunService(); try { DoMyTask(); } catch (Exception ex) { LogService.WriteErrorLog(ex, "CAXA.MES.ServerBusinessService"); throw ex; Status = -1; } finally { GC.Collect(); //强制在此对所有代进行垃圾回收,释放系统资源,防止数据量过大导致程序不稳定 Status = 0; } } break; case 1: //正在运行 { //TODO:在此添加程序正在运行时,在此运行时处理代码 Status = 3; } break; case 2: //等待 { //TODO:在此添加程序等待处理代码 Status = 3; } break; case 3: //正在取消 { //TODO:在此添加程序取消处理代码 Status = 3; } break; default: //未知 { //TODO:在此添加未知异常信息处理代码 Status = Int32.MaxValue; } break; } } 触发以上方法的调用方式: if (!worker.IsBusy) worker.RunWorkerAsync(); 取消挂起的后台操作方法: if (worker.IsBusy) worker.CancelAsync(); 再注册两个报告进度的事件: //BackgroundWorker.ReportProgress(System.Int32) 时发生 worker.ProgressChanged += progressChanged; //当后台操作已完成、被取消或引发异常时发生 worker.RunWorkerCompleted += runWorkerCompleted;

Demo

/// <summary> /// Asyn /// </summary> public class Asyn { #region 构造函数 public Asyn() { Worker = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true, }; Worker.DoWork +=worker_DoWork; } #endregion #region 属性字段 public BackgroundWorker Worker { get; private set; } public const int LoopCount = 100; public static int CurProcessVal = 0; #endregion #region 私有方法 private void worker_DoWork(object sender, DoWorkEventArgs e) { while (CurProcessVal++ < LoopCount) { if (Worker.CancellationPending) //如果执行停止操作变为true { e.Cancel = true; break; } Thread.Sleep(100); Worker.ReportProgress(CurProcessVal); } } #endregion #region 公有方法 public void Start() { if (!Worker.IsBusy) Worker.RunWorkerAsync(); } public void Stop() { if (Worker.IsBusy) { Worker.CancelAsync(); } } #endregion }

调用:

public partial class Form1 : Form { private Asyn _asyn; public Form1() { InitializeComponent(); _asyn = new Asyn(); _asyn.Worker.ProgressChanged += worker_ProgressChanged; _asyn.Worker.RunWorkerCompleted += worker_RunWorkerCompleted; bar.Maximum = Asyn.LoopCount; } private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { bar.ProgressBar.Invoke(new Action(() => bar.Value = e.ProgressPercentage)); statusLabel.Text = string.Format("正在处理...({0}/{1})", e.ProgressPercentage, Asyn.LoopCount); } private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { bar.ProgressBar.Invoke(new Action(() => bar.Value = Asyn.LoopCount)); if (e.Cancelled) { statusLabel.Text = "处理已停止"; bar.ProgressBar.Invoke(new Action(() => bar.Value = Asyn.CurProcessVal)); } else { statusLabel.Text = "处理完成"; } } private void button1_Click(object sender, EventArgs e) { _asyn.Start(); } private void button2_Click(object sender, EventArgs e) { _asyn.Stop(); } }

结果预览:

源码下载: http://download.csdn.net/detail/daigualu/9834563

转载请注明原文地址: https://www.6miu.com/read-28735.html

最新回复(0)