.NET-BackgroundWorker实现异步处理和滚动条报告进度Demo
来源:互联网 发布:sql语句在哪里输入 编辑:程序博客网 时间:2024/06/06 01:47
基本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
2 0
- .NET-BackgroundWorker实现异步处理和滚动条报告进度Demo
- jquery处理进度滚动条
- css+js实现进度滚动条
- Unity3D【脚本】 异步切换场景,显示进度到滚动条
- BackgroundWorker实现异步
- 多线程异步实现(backgroundworker)
- WPF BackgroundWorker线程与进度的处理
- C# BackgroundWorker 异步控件 Demo示例
- .net实现网站滚动条功能
- canvas实现滚动条缩放图片的demo
- 异步BackgroundWorker
- WinForm BackgroundWorker实现异步执行代码
- C#backgroundworker中更新datagridview出现滚动条问题
- EXTJS 滚动条之数据加载进度
- textblock 实现滚动条和自动换行
- 实时滚动进度的实现
- 滚动条处理笔记
- 滚动条处理
- hadoop平台使用python编写mapreduce二次排序小程序
- mysql ERROR 1045 (28000): 错误解决办法
- ssh 远程登录 不用密码设置方法 ssh-keygen -t rsa
- 3,ActiveMQ-Topic订阅发布模式
- android动画(一)逐帧动画
- .NET-BackgroundWorker实现异步处理和滚动条报告进度Demo
- angularjs 删除作用域时清除$watch
- 【模拟】洛谷 P1075 质因数分解
- 关于对编程语言的一点理解
- Android 传统蓝牙(1)
- 设置C++控制台输出行数
- SAP中使用BDC创建或修改采购信息记录
- c++第五次上机作业
- 如何恢复系统桌面文件