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

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

.net 2.0 BackgroundWorker类详细用法相关推荐

  1. C BackgroundWorker类详细说明

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Back ...

  2. php class类的用法详细总结

    以下是对php中class类的用法进行了详细的总结介绍,需要的朋友可以过来参考下 一:结构和调用(实例化): class className{} ,调用:$obj = new className(); ...

  3. __declspec关键字详细用法

    __declspec关键字详细用法 2009-01-21 16:23 __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与ext ...

  4. wxIntegerValidator< T > 类模板用法

    wxIntegerValidator< T > 类模板用法 wxIntegerValidator< T > 类模板用法 用法详细说明 wxIntegerValidator< ...

  5. java中日历类的用法_java日期类的用法

    java日期类的用法 不管你是处理财务交易还是计划着下一步的行动,你都要知道怎样在Java中建立,使用和显示日期.这需要你简单的查阅一下相应类的API参考:一个日期可以创建3个相关类的对象.这篇文章告 ...

  6. Python控制键盘鼠标pynput的详细用法 (转载)

    Python控制键盘鼠标pynput的详细用法 更新时间:2019年01月28日 15:15:16   作者:botoo 这篇文章主要介绍了Python控制键盘鼠标pynput的详细用法,小编觉得挺不 ...

  7. C# MediaPlayer的详细用法

    AxWindowsMediaPlayer的详细用法 作者:龙昊雪 AxWindowsMediaPlayer的详细用法收藏 function StorePage(){d=document;t=d.sel ...

  8. SerialPort类的用法与示例

    SerialPort类的用法与示例 文章目录 SerialPort类的用法与示例 1. 串口硬件信号定义 2. 串口端口号搜索 3. 串口属性参数设置 4. 串口发送信息 5. 串口接收信息 串口工具 ...

  9. Tomcat 启动闪退问题解决集(八大类详细)

    Tomcat启动闪退问题解决集(八大类详细) 本文目录: 一.Java环境不对,Tomcat 不同版本需要的Java环境不同. 二.环境变量没有配置好 三.Tomcat端口被占用 四.配置文件编码问题 ...

最新文章

  1. 安装Grid Control
  2. 通过生成器写一个日志调用方法
  3. pandas用众数填充缺失值_7步搞定数据清洗-Python数据清洗指南
  4. flash调用js中的方法,让js传递变量给flash (兼容 IE FF) (转)
  5. 一个通用的makefile写法,自动推导文件的依赖关系
  6. Python | 查找字符串中每个字符的频率
  7. swift面向对象之方法
  8. 如何免费的让网站启用HTTPS
  9. 电子书下载(强烈推荐):《大道至简——软件工程实践者的思想》
  10. hdu 4609 3-idiots(FFT计数)
  11. 【非长篇大论】X3D - Web3D标准的发展
  12. python爬虫批量下载美女吧美女图片
  13. mac环境变量配置文件加载优先级
  14. 联想x3850x6从u盘引导_联想笔记本bios设置u盘启动教程
  15. 骁龙神经处理引擎(Snapdragon Neural Processing Engine)
  16. apple configurator 2 获取appstore ipa包
  17. unity UI 跟随3D物体移动
  18. java语言简介论文,基于Java的Web论坛开发.doc
  19. typecpd协议规范 C语言,USB-C(USB Type-C)规范的简单介绍和分析
  20. Android 打包报 Invalid keystore format

热门文章

  1. 码云gitee最大文件限制
  2. Base64的解码和编码
  3. 带AM或者PM的时间字符串转data类型
  4. weblogic集群安装心得-程序包发布
  5. 在Mac配置adb命令
  6. 线性模型的最小二乘法拟合(转)
  7. 手动修改Outlook 2007 邮件签名
  8. 如何设置VSS源代码管理工具使用KDiff3
  9. Struts2拦截器的使用
  10. Linux系统Sudo基本用法