BackgroundWorker

  参考资料 微软技术资源库百度百科

  最近修改公司以前项目看到有BackgroundWorker的使用,发现很是方便。总结出来以供日后使用。  

  BackgroundWorker 类允许您在单独的专用线程上运行操作。 耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。 如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。

若要在后台执行耗时的操作,先创建一个 BackgroundWorker,用于侦听报告操作进度并在操作完成时发出信号的事件。 可以通过编程方式创建BackgroundWorker,也可以将它从“工具箱”“组件”选项卡中拖到窗体上。 如果在 Windows 窗体设计器中创建 BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中。

若要为后台操作做好准备,请添加 DoWork 事件的事件处理程序。 在此事件处理程序中调用耗时的操作。 若要开始此操作,请调用 RunWorkerAsync 若要收到进度更新的通知,请处理 ProgressChanged 事件。 若要在操作完成时收到通知,请处理 RunWorkerCompleted 事件。最后处理完之后调用Dispose方法释放资源。

界面图片如下:

代码如下:

 

View Code
namespace BackGroundDoWorkDemo
{
public partial class Form1 : Form
{

public Form1()
{
InitializeComponent();
//WorkerReportsProgress属性设置为True的时候才能够调用ProgressChanged
bgwCalculate.WorkerReportsProgress = true;
//WorkerSupportsCancellation设置为True的时候才能够进行中途取消操作。
bgwCalculate.WorkerSupportsCancellation = true;

}

/// <summary>
/// 开始计算操作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStart_Click(object sender, EventArgs e)
{
//判断是否是正在进行进行处理中。
if (!bgwCalculate.IsBusy)
{
//RunWorkerAsync有两个构造函数,可以通过但参数的构造函数传递参数到DoWork()中
//参数共耗费时间的处理方法等使用。
bgwCalculate.RunWorkerAsync(10);
btnStart.Enabled = false;
}

}

//取消正在进行的操作。
private void btnCancle_Click(object sender, EventArgs e)
{
//判断是否支持取消操作
if (bgwCalculate.WorkerSupportsCancellation == true)
{
bgwCalculate.CancelAsync();
btnStart.Enabled = true;
}
}

/// <summary>
/// 后台工作时间对应的方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void bgwCalculate_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bwk = sender as BackgroundWorker;
int count = int.Parse(e.Argument.ToString());

for (int i = 1; i <= count; i++)
{
if (bwk.CancellationPending == true)
{
e.Cancel = true;
break;
}
else
{
// Perform a time consuming operation and report progress.
System.Threading.Thread.Sleep(500);
bwk.ReportProgress(i * 10);
}
}

}
/// <summary>
/// 取消事件对应的后台方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void bgwCalculate_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pgbShow.Step = 10;
pgbShow.PerformStep();
}

/// <summary>
/// 后台事件完成对应的处理方法。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void bgwCalculate_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled==true)
{
lbResult.Text = "取消";
}
else if(e.Error!=null)
{
lbResult.Text = e.Error.Message;
}
else
{
lbResult.Text = "完成";
}
}

}
}



posted @ 2012-03-21 16:52  mopheify  阅读(1524)  评论(6编辑  收藏  举报