代码改变世界

BackgroundWorker 类

2011-07-01 11:58  Carl Xing  阅读(429)  评论(0编辑  收藏  举报

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

若要在后台执行耗时的操作,请创建一个 BackgroundWorker,侦听那些报告操作进度并在操作完成时发出信号的事件。

可以通过编程方式创建 BackgroundWorker

// Set up the BackgroundWorker object by
// attaching event handlers.
privatevoid InitializeBackgoundWorker()
{
backgroundWorker1.DoWork
+=
new DoWorkEventHandler(backgroundWorker1_DoWork);
backgroundWorker1.RunWorkerCompleted
+=
new RunWorkerCompletedEventHandler(
backgroundWorker1_RunWorkerCompleted);
backgroundWorker1.ProgressChanged
+=
new ProgressChangedEventHandler(
backgroundWorker1_ProgressChanged);
}

,也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。如果在 Windows 窗体设计器中创建 BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中。

若要设置后台操作,请为 DoWork 事件添加一个事件处理程序。在此事件处理程序中调用耗时的操作。若要启动该操作,请调用 RunWorkerAsync。若要收到进度更新通知,请对 ProgressChanged 事件进行处理。若要在操作完成时收到通知,请对 RunWorkerCompleted 事件进行处理。

您必须非常小心,确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChangedRunWorkerCompleted 事件与用户界面进行通信。

具体参见MSDN:ms-help://MS.MSDNQTR.v90.chs/fxref_system/html/0d0bd685-a893-fa26-f9b6-0d4d7e2af8c6.htm

-----------------------------------------------------示例-----------------------------------------------------------------------------------

form中添加 backgroundworker控件,progressbar控件,开始按钮,停止按钮。

        private static int count1 = 10;

/// <summary>
/// 用于多个backagegroundworker共用的方法
/// </summary>
/// <param name="worker"></param>
/// <param name="e"></param>
/// <returns></returns>
private int DoWork(BackgroundWorker worker, DoWorkEventArgs e)
{
//result即为在RunWorkerAsync中传入的参数count1
int result = (int)e.Argument;
for (int i = 0; i < result; i++)
{
if (worker.CancellationPending)
{
return i;
}
int percent = (int)((double)i / result*100);
worker.ReportProgress(percent);
Thread.Sleep(1000);
}
return result;
}

#region page1

private void buttonStart1_Click(object sender, EventArgs e)
{
//count1作为参数传入DoWork事件中
backgroundWorker1.RunWorkerAsync(count1);
}

private void buttonStop1_Click(object sender, EventArgs e)
{
backgroundWorker1.CancelAsync();
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
e.Result = DoWork(worker, e);
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//更新进度条进度
progressBar1.Value = e.ProgressPercentage;
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar1.Value = 100;
MessageBox.Show(string.Format("Total records: {0}", e.Result));
}

#endregion