http://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker(VS.80).aspx

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

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

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

下面代码演示如何用BackgroundWorker计算斐波那契数列并表示当前进度

/////////////////////////////Form1.cs///////////////////////////////

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication2
{
public partial class Form1 : Form
{
private int numberToCompute = 0;
private int highestPercentageReached = 0;
public Form1()
{
InitializeComponent();
InitializeBackgoundWorker();
}
// Set up the BackgroundWorker object by 
// attaching event handlers. 
private void InitializeBackgoundWorker()
{
backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
}
private void startAsyncButton_Click(System.Object sender, System.EventArgs e)
{
// Reset the text in the result label.
resultLabel.Text = String.Empty;

// Disable the UpDown control until 
// the asynchronous operation is done.
this.numericUpDown1.Enabled = false;

// Disable the Start button until 
// the asynchronous operation is done.
this.startAsyncButton.Enabled = false;

// Enable the Cancel button while 
// the asynchronous operation runs.
this.cancelAsyncButton.Enabled = true;

// Get the value from the UpDown control.
numberToCompute = (int)numericUpDown1.Value;

// Reset the variable for percentage tracking.
highestPercentageReached = 0;

// Start the asynchronous operation.
backgroundWorker1.RunWorkerAsync(numberToCompute);
}
private void cancelAsyncButton_Click(System.Object sender, System.EventArgs e)
{
// Cancel the asynchronous operation.
this.backgroundWorker1.CancelAsync();
// Disable the Cancel button.
cancelAsyncButton.Enabled = false;
}
// This event handler is where the actual,
// potentially time-consuming work is done.
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// Get the BackgroundWorker that raised this event.
BackgroundWorker worker = sender as BackgroundWorker;
// Assign the result of the computation
// to the Result property of the DoWorkEventArgs
// object. This is will be available to the 
// RunWorkerCompleted eventhandler.
e.Result = ComputeFibonacci((int)e.Argument, worker, e);
}

// This event handler deals with the results of the
// background operation.
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// First, handle the case where an exception was thrown.
if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
}
else if (e.Cancelled)
{
// Next, handle the case where the user canceled 
// the operation.
// Note that due to a race condition in 
// the DoWork event handler, the Cancelled
// flag may not have been set, even though
// CancelAsync was called.
resultLabel.Text = "Canceled";
}
else
{
// Finally, handle the case where the operation 
// succeeded.
resultLabel.Text = e.Result.ToString();
}
// Enable the UpDown control.
this.numericUpDown1.Enabled = true;
// Enable the Start button.
startAsyncButton.Enabled = true;
// Disable the Cancel button.
cancelAsyncButton.Enabled = false;
}
// This event handler updates the progress bar.
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
}

// This is the method that does the actual work. For this
// example, it computes a Fibonacci number and
// reports progress as it does its work.
long ComputeFibonacci(int n, BackgroundWorker worker, DoWorkEventArgs e)
{
// The parameter n must be >= 0 and <= 91.
// Fib(n), with n > 91, overflows a long.
if ((n < 0) || (n > 91))
{
throw new ArgumentException("value must be >= 0 and <= 91", "n");
}
long result = 0;

// Abort the operation if the user has canceled.
// Note that a call to CancelAsync may have set 
// CancellationPending to true just after the
// last invocation of this method exits, so this 
// code will not have the opportunity to set the 
// DoWorkEventArgs.Cancel flag to true. This means
// that RunWorkerCompletedEventArgs.Cancelled will
// not be set to true in your RunWorkerCompleted
// event handler. This is a race condition.
if (worker.CancellationPending)
{
e.Cancel = true;
}
else
{
if (n < 2)
{
result = 1;
}
else
{
result = ComputeFibonacci(n - 1, worker, e) + ComputeFibonacci(n - 2, worker, e);
}

// Report progress as a percentage of the total task.
int percentComplete = (int)((float)n / (float)numberToCompute * 100);
if (percentComplete > highestPercentageReached)
{
highestPercentageReached = percentComplete;
worker.ReportProgress(percentComplete);
}
}
return result;
}
}
}

最新文章

  1. 第3月第19天 cxx_destruct dispatch_get_main_queue()死锁
  2. YII 的源码分析(-)
  3. HTML文档、javascript脚本的加载与解析
  4. ebs R12.2启动报错&quot;failed to start a managed process after the maximum retry limit&quot;
  5. arcgis中DEM如何生成等高线
  6. C++常量(C++数值常量、字符串常量、符号常量)
  7. 蓝牙 CoreBluetooth
  8. CentOS7安装Tomcat8.X
  9. Unity 制作RPG地图2(自己控制地图上图标)
  10. shell 获取指定目录下文件名
  11. MySQL分页优化中的“INNER JOIN方式优化分页算法”到底在什么情况下会生效?
  12. Ubuntu on win10
  13. IIC时序操作24C02芯片
  14. elementUI vue v-model的修饰符
  15. IO流----操作文件的9种方法代码实现
  16. apache基础学习
  17. Learning-Python【7】:Python数据类型(3)—— 字典、集合
  18. centos7下安装docker(13.2容器数据共享)
  19. 汇编_指令_SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR
  20. spring-cloud-sleuth+zipkin追踪服务实现(一)

热门文章

  1. 巧用AWK处理二进制数据文件
  2. Protocol and Delegate
  3. [LeetCode]题解(python):056-Merge Intervals
  4. C# base和this
  5. LeetCode Shortest Word Distance II
  6. A股市场各行业龙头股一览表
  7. myeclipse中的web项目导入到eclipse中注意事项,项目部署到tomcat后无法访问jsp文件
  8. Java基础——数组Array
  9. python 子类继承父类的__init__方法
  10. storm 随机发送字符串