博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.net 2.0 BackgroundWorker类详细用法
阅读量:5803 次
发布时间:2019-06-18

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

  在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.     }  

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

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

你可能感兴趣的文章
开源 免费 java CMS - FreeCMS1.2-标签 infoSign
查看>>
开源 免费 java CMS - FreeCMS1.9 移动APP生成栏目列表数据
查看>>
git reset 三种用法总结
查看>>
hdfs笔记
查看>>
虚拟机新增加硬盘,不用重启读到新加的硬盘
查看>>
Java IO流详尽解析
查看>>
邮件服务系列之四基于虚拟用户的虚拟域的邮件系统(安装courier-authlib以及部分配置方法)...
查看>>
Linux VSFTP服务器
查看>>
《中国梦之声》新季开播 乐视生态“逆向造星”
查看>>
DHCP中继数据包互联网周游记
查看>>
Squid 反向代理服务器配置
查看>>
Java I/O操作
查看>>
Tomcat性能调优
查看>>
项目管理心得
查看>>
Android自学--一篇文章基本掌握所有的常用View组件
查看>>
灰度图像和彩色图像
查看>>
通过vb.net 和NPOI实现对excel的读操作
查看>>
TCP segmentation offload
查看>>
java数据类型
查看>>
数据结构——串的朴素模式和KMP匹配算法
查看>>