using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace CSharper开发实例
{
public partial class Frm_BackgroundWorker : Form
{
private BackgroundWorker bgWorke = new BackgroundWorker();
public Frm_BackgroundWorker()
{
InitializeComponent();
InitializeBackgroundWorker();
}
private void InitializeBackgroundWorker()
{
/*
bool类型,指示BackgroundWorker是否可以报告进度更新。
当该属性值为True是,将可以成功调用ReportProgress方法,否则将引发
InvalidOperationException异常。 用法:
*/
bgWorke.WorkerReportsProgress = true;
/*
bool类型,指示BackgroundWorker是否支持异步取消操作。当该属性值为True是,将可以成功
调用CancelAsync方法,
否则将引发InvalidOperationException异常。 用法:
*/
bgWorke.WorkerSupportsCancellation = true;
/*
用于承载异步操作。当调用BackgroundWorker.RunWorkerAsync()时触发。
需要注意的是,由于DoWork事件内部的代码运行在非UI线程之上,所以在DoWork事件内部应避
免于用户界面交互,
而于用户界面交互的操作应放置在ProgressChanged和RunWorkerCompleted事件中。
*/
bgWorke.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
//更新通知UI
bgWorke.ProgressChanged += new
ProgressChangedEventHandler(bgWorker_ProgessChanged);
/*
异步操作完成或取消时执行的操作,当调用DoWork事件执行完成时触发。
该事件的RunWorkerCompletedEventArgs参数包含三个常用的属性
Error,Cancelled,Result。其中,Error表示在执行异步操作期间发生的错误;
Cancelled用于判断用户是否取消了异步操作;Result属性接收来自DoWork事件的
DoWorkEventArgs参数的Result属性值,可用于传递异步操作的执行结果
*/
bgWorke.RunWorkerCompleted += new
RunWorkerCompletedEventHandler(bgWorker_WorkerCompleted);
//支持异步取消操作
bgWorke.WorkerSupportsCancellation = true;
}
public void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 100; i++)
{
//CancellationPending ch: bool类型指示应用程序是否已请求取消后台操作
if (bgWorke.CancellationPending)
{
e.Cancel = true;
return;
}
else
{
/* 报告操作进度。调用该方法后,将触发BackgroundWorker.ProgressChanged事
件。另外,该方法包含了一个int类型的参数percentProgress,
用来表示当前异步操作所执行的进度百分比。 该方法还有一个重载方法:
ReportProgress(Int percentProgress, Object userState)。
允许传递一个Object类型的状态对象到 ProgressChanged事件中,并且可以通过
ProgressChanged事件的ProgressChangedEventArgs.UserState属性取得参数
值。
注:调用该方法之前需确保WorkerReportsProgress属性值为True,否则将引发
InvalidOperationException异常。
用法:*/
bgWorke.ReportProgress(i, "Working");
System.Threading.Thread.Sleep(10);
}
}
}
public void bgWorker_ProgessChanged(object sender, ProgressChangedEventArgs e)
{
//string state = (string)e.UserState;//接收ReportProgress方法传递过来的
userState
this.progressBar1.Value = e.ProgressPercentage;
this.label1.Text = "处理进度:" + Convert.ToString(e.ProgressPercentage) +
"%";
}
public void bgWorker_WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show(e.Error.ToString());
return;
}
if (!e.Cancelled)
this.label1.Text = "处理完毕!";
else
this.label1.Text = "处理终止!";
}
private void Btn_Stop_Click(object sender, EventArgs e)
{
this.Btn_Start.Enabled = true;
this.Btn_Stop.Enabled = false;
/*
请求取消当前正在执行的异步操作。调用该方法将使BackgroundWorker.CancellationPending属性设置为True。
但需要注意的是,并非每次调用CancelAsync()都能确保异步操作,CancelAsync()通常不适用于取消一个紧密执行的操作,
更适用于在循环体中执行。
*/
bgWorke.CancelAsync();
}
private void Btn_Start_Click(object sender, EventArgs e)
{
if (bgWorke.IsBusy)
return;
this.progressBar1.Maximum = 100;
this.Btn_Start.Enabled = false;
this.Btn_Stop.Enabled = true;
/*
开始执行一个后台操作。调用该方法后,将触发BackgroundWorker.DoWork事件,并以异步的方式执行DoWork事件中的代码。
该方法还有一个带参数的重载方法:RunWorkerAsync(Object)。该方法允许传递一个Object类型的参数到后台操作中,
并且可以通过DoWork事件的DoWorkEventArgs.Argument属性将该参数提取出来。
注:当BackgroundWorker的IsBusy属性为True时,调用该方法将引发InvalidOperationException异常。
*/
bgWorke.RunWorkerAsync("hello");
}
}
}
版权声明:本文为weixin_41424481原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。