程序代码

BackgroundWorker组件
在VS2005中添加了BackgroundWorker组件,该组件在多线程编程方面使用起来非常方便,然而在开始时由于没有搞清楚它的使用机制,走了不少的弯路,现在把我在使用它的过程中的经验与诸位分享一下。
    BackgroundWorker类中主要用到的有这列属性、方法和事件:
    重要属性:
    1、CancellationPending             获取一个值,指示应用程序是否已请求取消后台操作。通过在DoWork事件中判断CancellationPending属性可以认定是否需要取消后台操作(也就是结束线程);
    2、IsBusy                          获取一个值,指示 BackgroundWorker 是否正在运行异步操作。程序中使用IsBusy属性用来确定后台操作是否正在使用中;
    3、WorkerReportsProgress           获取或设置一个值,该值指示BackgroundWorker能否报告进度更新
    4、WorkerSupportsCancellation      获取或设置一个值,该值指示 BackgroundWorker 是否支持异步取消。设置WorkerSupportsCancellation为true使得程序可以调用CancelAsync方法提交终止挂起的后台操作的请求;
    重要方法:
    1、CancelAsync         请求取消挂起的后台操作
    2、RunWorkerAsync      开始执行后台操作
    3、ReportProgress      引发ProgressChanged事件 
    重要事件:
    1、DoWork              调用 RunWorkerAsync 时发生
    2、ProgressChanged     调用 ReportProgress 时发生
    3、RunWorkerCompleted  当后台操作已完成、被取消或引发异常时发生
    另外还有三个重要的参数是RunWorkerCompletedEventArgs以及DoWorkEventArgs、ProgressChangedEventArgs。
    BackgroundWorker的各属性、方法、事件的调用机制和顺序:
从上图可见在整个生活周期内发生了3次重要的参数传递过程:
    参数传递1:此次的参数传递是将RunWorkerAsync(Object)中的Object传递到DoWork事件的DoWorkEventArgs.Argument,由于在这里只有一个参数可以传递,所以在实际应用往封装一个类,将整个实例化的类作为RunWorkerAsync的Object传递到DoWorkEventArgs.Argument;
    参数传递2:此次是将程序运行进度传递给ProgressChanged事件,实际使用中往往使用给方法和事件更新进度条或者日志信息;
    参数传递3:在DoWork事件结束之前,将后台线程产生的结果数据赋给DoWorkEventArgs.Result一边在RunWorkerCompleted事件中调用RunWorkerCompletedEventArgs.Result属性取得后台线程产生的结果。
    另外从上图可以看到DoWork事件是在后台线程中运行的,所以在该事件中不能够操作用户界面的内容,如果需要更新用户界面,可以使用ProgressChanged事件及RunWorkCompleted事件来实现。
在WinForm中经常遇到一些费时的操作界面,比如统计某个磁盘分区的文件夹或者文件数目,如果分区很大或者文件过多的话,处理不好就会造成“假死”的情况,或者报“线程间操作无效”的异常,为了解决这个问题,可以使用委托来处理,在.net2.0中还可以用BackgroundWorker类。
BackgroundWorker类是.net 2.0里新增加的一个类,对于需要长时间操作而不需要用户长时间等待的情况可以使用这个类。
注意确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
/*
* 作者:周公
* BackgroundWorker类是.net 2.0里新增加的一个类,对于需要长时间操作而不需要用户长时间等待的情况可以使用这个类。
* 注意确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。
* 它有几个属性:
* CancellationPending——指示应用程序是否已请求取消后台操作。
* IsBusy——指示 BackgroundWorker 是否正在运行异步操作
* WorkerReportsProgress——该值指示 BackgroundWorker 能否报告进度更新
* WorkerSupportsCancellation——该值指示 BackgroundWorker 是否支持异步取消
* 还有如下事件:
* DoWork——调用 RunWorkerAsync 时发生。
* ProgressChanged——调用 ReportProgress 时发生。
* RunWorkerCompleted——当后台操作已完成、被取消或引发异常时发生。
*
* 还有如下方法:
* CancelAsync——请求取消挂起的后台操作
* ReportProgress——引发 ProgressChanged 事件
* RunWorkerAsync——开始执行后台操作
*
**/
namespace BackgroundWorkerDemo
{
    public partial class MainForm : Form
    {
        private BackgroundWorker worker = new BackgroundWorker();
        public MainForm()
        {
            InitializeComponent();
            worker.WorkerReportsProgress = true;
            worker.WorkerSupportsCancellation = true;
            //正式做事情的地方
            worker.DoWork+=new DoWorkEventHandler(DoWork);
            //任务完称时要做的,比如提示等等
            worker.ProgressChanged += new ProgressChangedEventHandler(ProgessChanged);
            //任务进行时,报告进度
            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompleteWork);
        }
        //调用 RunWorkerAsync 时发生
        public void DoWork(object sender, DoWorkEventArgs e)
        {
            e.Result = ComputeFibonacci(worker, e);//当ComputeFibonacci(worker, e)返回时,异步过程结束
        }
        //调用 ReportProgress 时发生
        public void ProgessChanged(object sender, ProgressChangedEventArgs e)
        {
            this.progressBar1.Value = e.ProgressPercentage;
        }
        //当后台操作已完成、被取消或引发异常时发生
        public void CompleteWork(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("完成!");
        }
        private int ComputeFibonacci(object sender, DoWorkEventArgs e)
        {
            for (int i = 0; i < 1000; i++)
            {
                if (worker.CancellationPending)
                {
                    e.Cancel = true;
                }
                else
                {
                    worker.ReportProgress(i);
                }
                System.Threading.Thread.Sleep(10);
            }
            return -1;
        }
        private void btnStart_Click(object sender, EventArgs e)
        {
            worker.RunWorkerAsync();
            btnStart.Enabled = false;
            btnPause.Enabled = true;
        }
        private void btnPause_Click(object sender, EventArgs e)
        {
            btnPause.Enabled = false;
            btnStart.Enabled = true;
            worker.CancelAsync();
        }
    }
}

http://www.qimao.cn/article.asp?id=168

转载于:https://www.cnblogs.com/25-to-life/archive/2010/09/08/1821713.html

zz backgroundworker C#相关推荐

  1. C# BackgroundWorker 详解

    C# BackgroundWorker 详解 在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题.解决这类问题的主要途径是使用多线程,启 ...

  2. 黄聪:BackGroundWorker解决“线程间操作无效: 从不是创建控件的线程访问它” (C# VS2008)...

    在编程中经常会遇到在一个按钮中执行复杂操作,并将复杂操作最后返回的值加入一个ListView或ComboBox中候选.这个时候程序会卡,当程序员将这些卡代码放进线程(Thread)中后发现当对控件操作 ...

  3. 如果在BackgroundWorker运行过程中关闭窗体…

    在Windows Form应用中,BackgroundWorker 类允许您在单独的专用线程上运行操作.耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态 ...

  4. C#中的BackgroundWorker控件

    Keywords: C# .NET BackgroundWorker Source: http://txw1958.cnblogs.com/ BackgroundWorker是.NET Framewo ...

  5. .NET控件名称缩写一览表 zz

    标准控件 1 btn Button 2 chk CheckBox 3 ckl CheckedListBox 4 cmb ComboBox 5 dtp DateTimePicker 6 lbl Labe ...

  6. .net 2.0 BackgroundWorker类详细用法

    在WinForm中经常遇到一些费时的操作界面,比如统计某个磁盘分区的文件夹或者文件数目,如果分区很大或者文件过多的话,处理不好就会造成"假死"的情况,或者报"线程间操作无 ...

  7. 支持取消操作和暂停操作的Backgroundworker

    这也是今天讨论的话题.取消是默认就支持的,而暂停则默认不支持.但通过ManualResetEvent可以对其进行干预. using System; using System.Collections.G ...

  8. c# BackgroundWorker组件介绍(属性、方法、事件)

    c# BackgroundWorker组件介绍(属性.方法.事件) 2008-07-03 16:28 在VS2005中添加了BackgroundWorker组件,该组件在多线程编程方面使用起来非常方便 ...

  9. 洗衣小窍门集锦 [ZZ]

    发信人: zhuangw (庄子·逍遥游), 信区: LIFE 标  题: 洗衣小窍门集锦 [ZZ] 发信站: BBS 碧海青天站 (Wed Aug  9 11:14:53 2006), 转信 一.清 ...

最新文章

  1. 机器学习中分类器常见评价指标
  2. es5 温故而知新 创建私有成员、私有变量、特权变量的方法
  3. 基于Android的校园二手商品交易平台,基于Android校园二手交易网站毕业设计论文.doc...
  4. mysqldumpslow基本使用
  5. LeetCode-二分查找-374. 猜数字大小
  6. pybombs 安装
  7. port wifi to ICS(4.0.3)
  8. RocketMQ基础概念剖析源码解析
  9. 驰骋工作流引擎-总体介绍
  10. Java 图片验证码的实现和模拟简单的登录
  11. 【ANSYS命令流】Workbench中施加流体渗透压力载荷(超详细)
  12. lj245a引脚功能图_JRC4558中文资料|引脚图及功能|应用电路图
  13. python ttf font weight_使用FontCreator将ttf字体制作多字重字体并打包为Magisk字体模块...
  14. FLASH三维照片墙组件(源文件)
  15. 俄罗斯方块游戏的算法
  16. Excel工作表事件(2)- Change事件
  17. Py之shap:shap.explainers.shap_values函数的简介、解读(shap_values[1]索引为1的原因)、使用方法之详细攻略
  18. 神经网络学习笔记(一) RBF径向基函数神经网络
  19. 计算机里面怎么建新的文档,【2人回答】怎样在电脑新建中添加Word文档?-3D溜溜网...
  20. Python数据分析2-pandas入门和实战

热门文章

  1. 买了社保,再买农村医保是不是多余?
  2. 别看人家日子过得很轻松的样子,实际都很难,相信吗?
  3. 楼对面的男士夏天就光膀子,请问大家,男士真的都爱光膀子吗?
  4. 科比退役时间什么时候
  5. 想赚钱是好事,但盲目创业就容易悲剧
  6. 跳槽想必职场人士都经历过,那么怎么样跳槽才算是跳对了槽呢?
  7. 盘点《令人心动的offer》中让人敲黑板的重点
  8. 做了全职妈妈后,你的生活将有5个方面的变化
  9. 自媒体玩到最后玩的是一种意识
  10. 5G时代商业逻辑的五大思考