博客
关于我
BackgroundWorker类
阅读量:537 次
发布时间:2019-03-08

本文共 5556 字,大约阅读时间需要 18 分钟。

BackgroundWorker类简介

BackgroundWorker类允许在单独的线程上执行耗时操作,避免阻塞用户界面。适用于需要长时间处理任务但不希望影响UI响应的场景。通过事件处理进度和完成状态,实现与UI的交互。
主要功能与使用方法

创建BackgroundWorker实例后,可通过RunWorkerAsync启动任务,DoWork事件处理耗时操作,ProgressChanged事件更新进度,RunWorkerCompleted事件通知完成。支持取消操作,确保线程安全和资源释放。
示例代码

以下示例展示了如何在C#中使用BackgroundWorker类计算斐波那契数:
using System;using System.Collections;using System.ComponentModel;using System.Threading;using System.Windows.Forms; public class FibonacciForm : Form{private int numberToCompute = 0;private int highestPercentageReached = 0;private NumericUpDown numericUpDown1;private Button startAsyncButton;private Button cancelAsyncButton;private ProgressBar progressBar1;private Label resultLabel;private BackgroundWorker backgroundWorker1; public FibonacciForm(){    InitializeComponent();    InitializeBackgroundWorker();}private void InitializeBackgroundWorker(){    backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);    backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);    backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);}private void startAsyncButton_Click(object sender, EventArgs e){    resultLabel.Text = string.Empty;    numericUpDown1.Enabled = false;    startAsyncButton.Enabled = false;    cancelAsyncButton.Enabled = true;    numberToCompute = (int)numericUpDown1.Value;    highestPercentageReached = 0;    backgroundWorker1.RunWorkerAsync(numberToCompute);}private void cancelAsyncButton_Click(object sender, EventArgs e){    backgroundWorker1.CancelAsync();    cancelAsyncButton.Enabled = false;}private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e){    BackgroundWorker worker = sender as BackgroundWorker;    e.Result = ComputeFibonacci((int)e.Argument, worker, e);}private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){    if (e.Error != null)    {        MessageBox.Show(e.Error.Message);    }    else if (e.Cancelled)    {        resultLabel.Text = "Canceled";    }    else    {        resultLabel.Text = e.Result.ToString();    }    numericUpDown1.Enabled = true;    startAsyncButton.Enabled = true;    cancelAsyncButton.Enabled = false;}private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e){    progressBar1.Value = e.ProgressPercentage;}long ComputeFibonacci(int n, BackgroundWorker worker, DoWorkEventArgs e){    if ((n < 0) || (n > 91))    {        throw new ArgumentException("value must be >= 0 and <= 91", "n");    }    long result = 0;    if (worker.CancellationPending)    {        e.Cancel = true;    }    else    {        if (n < 2)        {            result = 1;        }        else        {            result = ComputeFibonacci(n - 1, worker, e) + ComputeFibonacci(n - 2, worker, e);        }        int percentComplete = (int)((float)n / (float)numberToCompute * 100);        if (percentComplete > highestPercentageReached)        {            highestPercentageReached = percentComplete;            worker.ReportProgress(percentComplete);        }    }    return result;}private void InitializeComponent(){    numericUpDown1 = new NumericUpDown();    startAsyncButton = new Button();    cancelAsyncButton = new Button();    resultLabel = new Label();    progressBar1 = new ProgressBar();    backgroundWorker1 = new BackgroundWorker();    numericUpDown1.Location = new Point(16, 16);    numericUpDown1.Maximum = new Decimal(new int[] { 91, 0, 0, 0 });    numericUpDown1.Minimum = new Decimal(new int[] { 1, 0, 0, 0 });    numericUpDown1.Name = "numericUpDown1";    numericUpDown1.Size = new Size(80, 20);    numericUpDown1.TabIndex = 0;    numericUpDown1.Value = new Decimal(new int[] { 1, 0, 0, 0 });    startAsyncButton.Location = new Point(16, 72);    startAsyncButton.Name = "startAsyncButton";    startAsyncButton.Size = new Size(120, 23);    startAsyncButton.TabIndex = 1;    startAsyncButton.Text = "Start Async";    startAsyncButton.Click += new EventHandler(startAsyncButton_Click);    cancelAsyncButton.Enabled = false;    cancelAsyncButton.Location = new Point(153, 72);    cancelAsyncButton.Name = "cancelAsyncButton";    cancelAsyncButton.Size = new Size(119, 23);    cancelAsyncButton.TabIndex = 2;    cancelAsyncButton.Text = "Cancel Async";    cancelAsyncButton.Click += new EventHandler(cancelAsyncButton_Click);    resultLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;    resultLabel.Location = new Point(112, 16);    resultLabel.Name = "resultLabel";    resultLabel.Size = new Size(160, 23);    resultLabel.TabIndex = 3;    resultLabel.Text = "(no result)";    resultLabel.TextAlign = ContentAlignment.MiddleCenter;    progressBar1.Location = new Point(18, 48);    progressBar1.Name = "progressBar1";    progressBar1.Size = new Size(256, 8);    progressBar1.Step = 2;    progressBar1.TabIndex = 4;    backgroundWorker1.WorkerReportsProgress = true;    backgroundWorker1.WorkerSupportsCancellation = true;    this.ClientSize = new Size(292, 118);    this.Controls.Add(progressBar1);    this.Controls.Add(resultLabel);    this.Controls.Add(cancelAsyncButton);    this.Controls.Add(startAsyncButton);    this.Controls.Add(numericUpDown1);    this.Name = "FibonacciForm";    this.Text = "Fibonacci Calculator";} }

继承层次结构

BackgroundWorker类继承自System.ComponentModel.Component,支持多种语言绑定。
线程安全

BackgroundWorker类的实例成员在多线程环境中不一定是线程安全的,需谨慎使用。
平台支持

支持Windows 98、Windows 2000 SP4及以上版本的操作系统。
版本信息

.NET Framework 2.0及以上版本支持BackgroundWorker类。
参考文档

获取更多关于BackgroundWorker类的开发文档和资源。

转载地址:http://hytiz.baihongyu.com/

你可能感兴趣的文章
8点FFT的C语言实现
查看>>
950个织梦网dede模板源码
查看>>
: bad interpreter: 没有那个文件或目录
查看>>
@Cacheable@CacheEvict@CachePut
查看>>
2018信息平台专场招聘
查看>>
@ControllerAdvice+@ExceptionHandler全局处理Controller层异常 及其 原理
查看>>
@ControllerAdvice、@ExceptionHandler控制全局Controller异常
查看>>
@ControllerAdvice用法
查看>>
#VERDI# 关于Verdi使用的几个常用技巧整理
查看>>
@Resource注解的使用
查看>>
@ResponseBody 和 @RequestBody
查看>>
A + B 九度oj
查看>>
A DBA’s take on MSCA (Mobile supply chain applications)
查看>>
A DBA’s take on MSCA (Mobile supply chain applications)
查看>>
A20地址线
查看>>
abaqus质量缩放系数取值_ABAQUS的质量缩放
查看>>
Access restriction: The type FileURLConnection is not accessible due to restriction
查看>>
#systemverilog# 关于随机约束之 数组类型数据
查看>>
Accessibility
查看>>
08-信息收集之端口收集(总结版)
查看>>