C# BackgroundWorker 异步控件 Demo示例
2015-12-29 18:35
585 查看
今天看别人代码时发现了C#的后台工作控件
源码:
BackgroundWorker,这是一个很方便很简单的异步处理方法,于是就写个小Demo记录一下,浅显易懂,帮助自己以后回顾,更主要的是希望可以帮助到正在看这篇Demo的你。
BackgroundWorker主要有三个响应事件:
DoWork: 后台执行逻辑代码的事件
ProgressChanged: 响应DoWork发送的修改UI处理的事件
RunWorkerCompleted: 当该BackgroundWorker运行结束后响应该事件
Demo:
WinForm截图:源码:
using System; using System.ComponentModel; using System.Threading; using System.Windows.Forms; namespace BackgroundWorkerDemo { public partial class Form1 : Form { private readonly BackgroundWorker _bgWorker; private bool _throw = false; public Form1() { InitializeComponent(); _bgWorker = new BackgroundWorker(); //允许发送消息,及调用ReportProgress()方法 _bgWorker.WorkerReportsProgress = true; //允许取消该进程,及调用CancelAsync()方法 _bgWorker.WorkerSupportsCancellation = true; //注册事件 _bgWorker.DoWork += _bgWorker_DoWork; _bgWorker.ProgressChanged += _bgWorker_ProgressChanged; _bgWorker.RunWorkerCompleted += _bgWorker_RunWorkerCompleted; } /// <summary> /// 后台工作进程接受后调用该方法 /// 该方法可以修改UI /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void _bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled) { _txt.Text = "用户取消加载"; } else if (e.Error != null) { _txt.Text = e.Error.Message; } else { _txt.Text = "加载完毕"; } } /// <summary> /// 后台进程收到ReportProgress()后调用该方法 /// 该方法可以修改UI /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void _bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { //修改UI,可以收到两个参数 //e.ProgressPercentage int //e.UserState object _pb.Value = e.ProgressPercentage; _nud.Value = e.ProgressPercentage; _txt.Text = string.Format("当前加载 {0}%", e.ProgressPercentage); } /// <summary> /// 后台进程处理逻辑 /// 该方法不能修改UI,若想修改UI就得发送ReportProgress()消息,通过ProgressChanged()方法修改 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void _bgWorker_DoWork(object sender, DoWorkEventArgs e) { for (var i = 0; i <= 100; i++) { //用户点了取消按钮,收到了CancelAsync()请求 if (_bgWorker.CancellationPending) { e.Cancel = true; return; } //模拟抛出异常 if (_throw) { throw new Exception("Throw Error."); } Thread.Sleep(100); _bgWorker.ReportProgress(i); } } /// <summary> /// 开始按钮 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void _btnStart_Click(object sender, EventArgs e) { _throw = false; if (!_bgWorker.IsBusy) { _bgWorker.RunWorkerAsync(); } } /// <summary> /// 取消按钮 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void _btnCancel_Click(object sender, EventArgs e) { if (_bgWorker.IsBusy) { _bgWorker.CancelAsync(); } } /// <summary> /// 抛异常按钮 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void _btnThrow_Click(object sender, EventArgs e) { _throw = true; } } }
相关文章推荐
- c#window服务程序
- [.NET源码] C#制作的一套在线更新软件系统
- c# 方法重载
- C#中this关键字的使用
- C#中的转译字符以及字符串前面@的作用
- C# 给word文档添加水印
- C# DataGridView 导出 Excel(根据Excel版本显示选择不同后缀格式xls或xlsx)
- 一小时学会C# 6
- C#中构造函数的使用
- C#控件补充
- C#ProgressBar控件和 TrackBar控件
- C#Timer 控件
- C#PictureBox 控件
- C#CheckedListBox 控件
- C#ListBox控件
- C# 给word文档添加水印
- C#使用多线程进行并发处理
- C#验证码识别类完整实例
- C#中Encoding的学习
- GeoHash C#版 找到周围8个区域的GeoHash编码