您的位置:首页 > 编程语言 > C#

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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: