在WinForm中经常遇到一些费时的操作界面,比如统计某个磁盘分区的文件夹或者文件数目,如果分区很大或者文件过多的话,处理不好就会造成“假死”的情况,或者报“线程间操作无效”的异常,为了解决这个问题,可以使用委托来处理,在.net2.0中还可以用BackgroundWorker类。

BackgroundWorker类是.net 2.0里新增加的一个类,对于需要长时间操作而不需要用户长时间等待的情况可以使用这个类。

注意确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。

它有几个属性:
CancellationPending——指示应用程序是否已请求取消后台操作。
IsBusy——指示 BackgroundWorker 是否正在运行异步操作
WorkerReportsProgress——该值指示 BackgroundWorker 能否报告进度更新
WorkerSupportsCancellation——该值指示 BackgroundWorker 是否支持异步取消

还有如下事件:
DoWork——调用 RunWorkerAsync 时发生。
ProgressChanged——调用 ReportProgress 时发生。
RunWorkerCompleted——当后台操作已完成、被取消或引发异常时发生。

还有如下方法:
CancelAsync——请求取消挂起的后台操作
ReportProgress——引发 ProgressChanged 事件
RunWorkerAsync——开始执行后台操作

关于BackgroundWorker类更多详细介绍可参考:http://blog.csdn.net/zhzuo/archive/2008/07/23/2699305.aspx

下载与本文相关的ProcessTest示例相关代码。
http://files.cnblogs.com/Jason_z/ProcessTest.rar
程序运行界面

主要代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ProcessTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            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();
        }
    }
}

转载于:https://www.cnblogs.com/Jason_z/archive/2009/10/15/1583669.html

WinForm:进度条的实现(异步)相关推荐

  1. Winform 进度条弹窗和任务控制

    Winform 进度条弹窗和任务控制 目录 Winform 进度条弹窗和任务控制 一.弹窗前台 二.弹窗后台 三.使用方法 四.效果展示和代码地址 独立观察员 2020 年 11 月 17 日 最近要 ...

  2. winform进度条实现

    最近要给一个 Winform 项目添加功能,需要一个能显示进度条的弹窗,还要求能够中止任务,所以就做了一个,在此做个记录总结.虽然用的是比较老的 Winform 技术,不过其中的原理都是相通的. lo ...

  3. winform进度条的实现

    1.第一种方法:直接实现 (1)界面 (2)设计一个按钮事件 private void button1_Click(object sender, EventArgs e){progressBar1.V ...

  4. Winform 进度条

    2019独角兽企业重金招聘Python工程师标准>>> #region 显示进度条         //全局参数定义如下         //private Form_Process ...

  5. 玲珑杯Unity开发心得——进度条界面(异步加载游戏场景)

    /2015/08/04// by xbw ///环境 unity 4.6// 先上效果图 还可以吧,先贴一下代码, using UnityEngine;using System.Collections ...

  6. C# .Net WinForm 进度条ProgressBar 用法 实例

    基本介绍 进度条控件,用于显示某操作动作进度或跑马灯效果. 常设置属性 Value:获取或设置进度栏的当前位置: Style:进度栏指示进度所使用的展示方式: Maximum:控件使用范围的上限: M ...

  7. WinForm中异步加载数据并使用进度条

    在WinForm程序中,有时会因为加载大量数据导致UI界面假死,这种情况对于用户来说是非常不友好的.因此,在加载大量数据的情况下,首先应该将数据加载放在另一线程中进行,这样保证了UI界面的响应:其次可 ...

  8. Winform中使用进度条的一个例子

    因为在winform程序中,UI线程负责界面相关的工作. Winform中使用进度条的方法有很多,可以直接创建一个新的线程Thread执行耗时的方法:也可以使用线程池. 例如: //使用线程池异步执行 ...

  9. 1.[C# Winform]BackgroundWorker实现进度条的那点事儿

    学习笔记01 公司前辈让我用C#winform结构来逐步实现一个他曾经写过的配置程序的批处理文件的所有功能.设计什么的就不说了,就是俩字简洁. 直接上过程. 小助手主页面 取消了最大化功能的小助手,如 ...

最新文章

  1. TensorFlow 版本 1.10.0 发布
  2. R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(双分类变量分组:色彩配置、形状配置)实战
  3. ASP.NET2.0 - ASP.net MVC和ASP.net Web Forms
  4. python filedialog_Python使用FileDialog将列表保存到指定的excel文件中,python,filedialog
  5. CSS3 border-radius妙用
  6. Spring Security第2部分–密码加密,自定义404和403错误页面
  7. 工业以太网交换机的接口知识详解
  8. java se开发_JAVA_SE基础——3.Java程序的开发流程
  9. 安全隐患分析和基本系统结构信息的收集
  10. 机器学习算法:马尔可夫链
  11. 《数据库原理与应用》课程实验报告三 --数据库的嵌套查询
  12. 为什么会出现双摄像头手机?
  13. 钱与情,钱与人,钱与命
  14. 【Unity】那些你不得不用的好插件!
  15. AI分析:微信热文有什么特点?兼谈中文分词算法
  16. 个人永久性免费-Excel催化剂功能第34波-提取中国身份证信息、农历日期转换相关功能...
  17. 深入理解操作系统原理之设备管理
  18. 旧款华为笔记本解锁智慧语音教程
  19. 初羡微商代理发货系统授权系统开发
  20. 虚拟主机1-基于IP

热门文章

  1. 前端学习(2964):路由的实现
  2. [vue] 怎么在vue中使用插件?
  3. [vue] 如何在子组件中访问父组件的实例?
  4. [css] 使用css的attr()写一个类似a标签title的提示框
  5. [vue-cli] 说下你了解的vue-cli原理?你可以自己实现个类vue-cli吗?
  6. [js] 微信小程序实现轨迹回放,微信原生小程序,基于uniapp的小程序?
  7. 前端学习(2799):实现资讯的结构和列表
  8. 前端学习(2645):懂代码之header表头页之未读消息
  9. 前端学习(2460):粉丝管理
  10. “约见”面试官系列之常见面试题第四十四篇之webpack打包原理解析?(建议收藏)