.net 2.0 BackgroundWorker类详细用法

简介:
  在WinForm中经常遇到一些费时的操作界面,比如统计某个磁盘分区的文件夹或者文件数目,如果分区很大或者文件过多的话,处理不好就会造成“假死”的情况,或者报“线程间操作无效”的异常,为了解决这个问题,可以使用委托来处理,在.net2.0中还可以用BackgroundWorker类。
 
        BackgroundWorker类是.net 2.0里新增加的一个类,对于需要长时间操作而不需要用户长时间等待的情况可以使用这个类。
        注意确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。
 
程序代码:
 
 

 
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Windows.Forms;  
  9.  
  10. namespace WinFormReport  
  11. {  
  12.     /*   
  13.  * 作者:周公   
  14.  * BackgroundWorker类是.net 2.0里新增加的一个类,对于需要长时间操作而不需要用户长时间等待的情况可以使用这个类。   
  15.  * 注意确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。   
  16.  * 它有几个属性:   
  17.  * CancellationPending——指示应用程序是否已请求取消后台操作。   
  18.  * IsBusy——指示 BackgroundWorker 是否正在运行异步操作   
  19.  * WorkerReportsProgress——该值指示 BackgroundWorker 能否报告进度更新   
  20.  * WorkerSupportsCancellation——该值指示 BackgroundWorker 是否支持异步取消   
  21.  * 还有如下事件:   
  22.  * DoWork——调用 RunWorkerAsync 时发生。   
  23.  * ProgressChanged——调用 ReportProgress 时发生。   
  24.  * RunWorkerCompleted——当后台操作已完成、被取消或引发异常时发生。   
  25.  *      
  26.  * 还有如下方法:   
  27.  * CancelAsync——请求取消挂起的后台操作   
  28.  * ReportProgress——引发 ProgressChanged 事件   
  29.  * RunWorkerAsync——开始执行后台操作   
  30.  *      
  31.  **/   
  32.     public partial class MainForm : Form  
  33.     {  
  34.         private BackgroundWorker worker = new BackgroundWorker();  
  35.         public MainForm()  
  36.         {  
  37.             InitializeComponent();  
  38.             worker.WorkerReportsProgress = true;  
  39.             worker.WorkerSupportsCancellation = true;  
  40.             //正式做事情的地方   
  41.             worker.DoWork += new DoWorkEventHandler(DoWork);  
  42.             //任务完称时要做的,比如提示等等   
  43.             worker.ProgressChanged += new ProgressChangedEventHandler(ProgessChanged);  
  44.             //任务进行时,报告进度   
  45.             worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompleteWork);  
  46.         }  
  47.  
  48.         //调用 RunWorkerAsync 时发生   
  49.         public void DoWork(object sender, DoWorkEventArgs e)  
  50.         {  
  51.             e.Result = ComputeFibonacci(worker, e);//当ComputeFibonacci(worker, e)返回时,异步过程结束   
  52.         }  
  53.         //调用 ReportProgress 时发生   
  54.         public void ProgessChanged(object sender, ProgressChangedEventArgs e)  
  55.         {  
  56.             this.progressBar1.Value = e.ProgressPercentage;  
  57.         }  
  58.         //当后台操作已完成、被取消或引发异常时发生   
  59.         public void CompleteWork(object sender, RunWorkerCompletedEventArgs e)  
  60.         {  
  61.             MessageBox.Show("完成!");  
  62.         }  
  63.  
  64.         private int ComputeFibonacci(object sender, DoWorkEventArgs e)  
  65.         {  
  66.             for (int i = 0; i < 1000; i++)  
  67.             {  
  68.                 if (worker.CancellationPending)  
  69.                 {  
  70.                     e.Cancel = true;  
  71.                     return -1;  
  72.                 }  
  73.                 else 
  74.                 {  
  75.                     int percent = 100 * i / 1000;//计算已完成的百分比  
  76.                     worker.ReportProgress(percent);  
  77.                 }  
  78.                 System.Threading.Thread.Sleep(10);  
  79.             }  
  80.             return -1;  
  81.         }  
  82.  
  83.         private void btnStart_Click(object sender, EventArgs e)  
  84.         {  
  85.             worker.RunWorkerAsync();  
  86.             btnStart.Enabled = false;  
  87.             btnPause.Enabled = true;  
  88.         }  
  89.  
  90.         private void btnPause_Click(object sender, EventArgs e)  
  91.         {  
  92.             btnPause.Enabled = false;  
  93.             btnStart.Enabled = true;  
  94.             worker.CancelAsync();  
  95.         }  
  96.  
  97.     }  
  98. } 

在此感谢luols指出其中的一个小bug。















本文转自周金桥51CTO博客,原文链接: http://blog.51cto.com/zhoufoxcn/166053,如需转载请自行联系原作者

相关文章
|
IDE API 开发工具
拦截|篡改|伪造.NET类库中不限于public的类和方法
本文除了回顾拦截.NET类库中的方法,实现方法参数的篡改、方法返回结果的伪造,再着重介绍.NET类库中非public类及方法如何拦截。
拦截|篡改|伪造.NET类库中不限于public的类和方法
|
存储 开发框架 NoSQL
ASP.NET WEB——项目中Cookie与Session的用法
ASP.NET WEB——项目中Cookie与Session的用法
326 0
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
668 8
|
JSON 安全 API
.net 自定义日志类
在.NET中,创建自定义日志类有助于更好地管理日志信息。示例展示了如何创建、配置和使用日志记录功能,包括写入日志文件、设置日志级别、格式化消息等。注意事项涵盖时间戳、日志级别、JSON序列化、线程安全、日志格式、文件处理及示例使用。请根据需求调整代码。
437 13
|
JSON 数据格式
.net HTTP请求类封装
`HttpRequestHelper` 是一个用于简化 HTTP 请求的辅助类,支持发送 GET 和 POST 请求。它使用 `HttpClient` 发起请求,并通过 `Newtonsoft.Json` 处理 JSON 数据。示例展示了如何使用该类发送请求并处理响应。注意事项包括:简单的错误处理、需安装 `Newtonsoft.Json` 依赖,以及建议重用 `HttpClient` 实例以优化性能。
787 2
|
数据采集 JSON API
.NET 3.5 中 HttpWebRequest 的核心用法及应用
【9月更文挑战第7天】在.NET 3.5环境下,HttpWebRequest 类是处理HTTP请求的一个核心组件,它封装了HTTP协议的细节,使得开发者可以方便地发送HTTP请求并接收响应。本文将详细介绍HttpWebRequest的核心用法及其实战应用。
991 6
|
缓存 程序员
封装一个给 .NET Framework 用的内存缓存帮助类
封装一个给 .NET Framework 用的内存缓存帮助类
373 1
|
开发框架 前端开发 .NET
闲话 ASP.NET Core 数据校验(二):FluentValidation 基本用法
闲话 ASP.NET Core 数据校验(二):FluentValidation 基本用法
471 1
.NET 4.0下实现.NET4.5的Task类相似功能组件
【10月更文挑战第29天】在.NET 4.0 环境下,可以使用 `BackgroundWorker` 类来实现类似于 .NET 4.5 中 `Task` 类的功能。`BackgroundWorker` 允许在后台执行耗时操作,同时不会阻塞用户界面线程,并支持进度报告和取消操作。尽管它有一些局限性,如复杂的事件处理模型和不灵活的任务管理方式,但在某些情况下仍能有效替代 `Task` 类。
357 0
|
存储 Go C#
【.NET Core】深入理解IO之File类
【.NET Core】深入理解IO之File类
514 6