C# BackgroundWorker组件学习入门介绍
一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用backgroundworker来完成这一功能.
backgroundworker类允许您在单独的专用线程上运行操作。 耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (ui) 似乎处于停止响应状态。
如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 backgroundworker类方便地解决问题(msdn)。
若要在后台执行耗时的操作,请创建一个 backgroundworker,侦听那些报告操作进度并在操作完成时发出信号的事件。 可以通过编程方式创建 backgroundworker,
也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。 如果在 windows 窗体设计器中创建 backgroundworker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中(msdn)。
属性:
isbusy:获取一个值,指示 backgroundworker 是否正在运行异步操作。
workerreportsprogress:获取或设置一个值,该值指示 backgroundworker 能否报告进度更新。
workersupportscancellation:获取或设置一个值,该值指示 backgroundworker 是否支持异步取消。
事件:
dowork:调用 runworkerasync 时发生。
progresschanged:调用 reportprogress 时发生。
runworkercompleted:当后台操作已完成、被取消或引发异常时发生。
实例:
窗体设计如下图:
代码实现:
using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.threading.tasks;
using system.windows.forms;
namespace windowsformsapplication2
{
public partial class form1 : form
{
public form1()
{
initializecomponent();
backgroundworker1.workerreportsprogress = true;
backgroundworker1.workersupportscancellation = true;
}
private void backgroundworker1_dowork(object sender, doworkeventargs e)
{
backgroundworker worker = sender as backgroundworker;
for (int i = 1; i <= 12; i++)
{
if (worker.cancellationpending == true)
{
e.cancel = true;
break;
}
else
{
system.threading.thread.sleep(500);
worker.reportprogress(i * 10);
}
}
}
private void backgroundworker1_progresschanged(object sender, progresschangedeventargs e)
{
lbresult.text = (e.progresspercentage.tostring() + "%"+e.userstate);
}
private void backgroundworker1_runworkercompleted(object sender, runworkercompletedeventargs e)
{
if (e.cancelled == true)
{
lbresult.text = "canceled!";
}
else if (e.error != null)
{
lbresult.text = "error: " + e.error.message;
}
else
{
lbresult.text = "done!";
}
}
private void btnstartasync_click(object sender, eventargs e)
{
if (backgroundworker1.isbusy != true)
{
backgroundworker1.runworkerasync();
}
}
private void btncancelasync_click(object sender, eventargs e)
{
if (backgroundworker1.workersupportscancellation == true)
{
backgroundworker1.cancelasync();
}
}
}
}
运行结果: