1. 定义全局变量
BackgroundWorker backgroundwoker;
2. 点击开始按钮或其它时机初始化
backgroundwoker = new BackgroundWorker();
backgroundwoker.WorkerSupportsCancellation = true;//允许中途取消进程
backgroundwoker.WorkerReportsProgress = true;
backgroundwoker.DoWork += new DoWorkEventHandler(BkWorkRun); //启动异步进程事件
backgroundwoker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(BkWorkCompleted); //完成事件
backgroundwoker.ProgressChanged += new ProgressChangedEventHandler(BkProgressChanged); //刷新进度条及所有相关界面控件事件
backgroundwoker.RunWorkerAsync(dt); //dt是传输参数,可以是任何数据类型
3.添加异步进程事件 注意参数 DoWorkEventArgs e 包含了传输参数RunWorkerAsync(dt)中的dt
void BkWorkRun(object sender, DoWorkEventArgs e)
{
    MilCvlCompare(e);
}
4.实际执行异步线程的方法
void MilCvlCompare(DoWorkEventArgs workArg)
{
    //wrkArg中包括输入和输出两个参数Argument和Result,同时它的workArg.Cancel表示取消进程
    DataTable dt = workArg.Argument as DataTable; //获取workArg传入参数
    //进度报告,除了报告主线程进度百分比外,还可传回任何需界面显示的数据
    backgroundwoker.ReportProgress(percent, new string[] { status,rescy });//第一个参数int型,必须<=100;第二个返回参数object型,可以返回任意数据
    ...
    workArg.Result = new string[] { res, path };//设置workArg的返回参数,此参数可在CompletedEventHandler事件中使用
}
5. 进度刷新界面
void BkProgressChanged(object sender, ProgressChangedEventArgs e)
{           
    progressBar.Value = e.ProgressPercentage; //刷新进度条
    //刷新界面文字提示
    //最好加上try catch避免用户中途关闭窗体,系统报错
    try
    {
        string[] res = e.UserState as string[];
        labInfo.Text = res[0];
        if(res[1]!="")
            tbOutPut.AppendText(res[1]+"\r\n\r\n");    }
    catch { }
}
6. 完成事件
void BkWorkCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Result == null)
        return;
    string[] res = e.Result as string[]; //获取返回值
    ...//处理返回值
    progressBar.Visible = false;
    btnParse.Enabled = true;           
}
7.取消机制
//CancelAsync方法是在前台主线程用的,CancellationPending属性是在后台子线程用的。实际的使用方式应该是这样的:
private void btn_Stop_Click(object sender, EventArgs e)  //点击取消按钮,前台触发CancelAsync方法
{
    backgroundwoker.CancelAsync(); //提交取消命令,但还未取消
}
//这时,CancellationPending由false变为true
//再在DoWork事件里获取CancellationPending,依据它来处理后台任务,比如说直接return;
static void bw_DoWork(object sender, DoWorkEventArgs workArg)
{            
    if (backgroundwoker.CancellationPending) //判断是否取消操作
    {
        workArg.Cancel = true; //这里才真正取消
        return;
    }
}
//最后完成时判断
static void BkWorkCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled)
        MessageBox.Show("You cancelled!");
    else if (e.Error != null)
        MessageBox.Show("Worker exception: " + e.Error.ToString());
    else
    {
           MessageBox.Show("Complete - " + e.Result);
    }
}

BackgroundWorker 的输入、输出参数、进度条与文字刷新、取消机制、返回事件的更多相关文章

  1. #Python绘制 文本进度条,带刷新、时间暂缓的

    #Python绘制 文本进度条,带刷新.时间暂缓的 #文本进度条 import time as T st=T.perf_counter() print('-'*6,'执行开始','-'*6) maxx ...

  2. 来看看Python炫酷的颜色输出与进度条打印

    英语单词优化 上篇文章写到了Python开发英语单词记忆工具,其中依赖了bootstrap.css jQuery.js 基础html模块以及片段的css样式.有些朋友问,怎么能将这个练习题打包成单独的 ...

  3. C# BackGroundWorker实现窗体不卡死 进度条功能

    网上的例子少了好多属性的配置,改好了一个能直接用的: using System; using System.Collections.Generic; using System.ComponentMod ...

  4. css 进度条的文字根据进度渐变

    需求 1.进度条里面的文字需要根据进度的长度而变化 原理 用两个一模一样的样式的 div 重叠起来 效果 字体开始为 蓝色,跟随进度条变为 白色 在线预览: https://jsfiddle.net/ ...

  5. shell实现带颜色输出的进度条

    1.基础版 #!/bin/bash b='' ;$i<=;i+=)) do printf "执行进度 :[%-50s]%d%%\r" $b $i sleep 0.001 b= ...

  6. DJANGO和UIKIT结合,作一个有进度条的无刷新上传功能

    以前作的上传,在糙了,所以在用户体验上改进一下. 同时,结合DJANGO作定位上传. 这其中分两步进行,第一次上传到TMP目录下, 第二次,将TMP下的文件转移到标准目录下. form.py file ...

  7. laravel 命令行输出进度条

    有时候我们想在命令行执行一些耗时的命令,我们可以利用 symfony 提供的进度条相关的类,来输出一个进度条,显示当前的处理进度. 参考:http://symfony.com/doc/current/ ...

  8. 自主学习python文本进度条及π的计算

    经过自己一段时间的学习,已经略有收获了!在整个过程的进行中,在我逐渐通过看书,看案例,做题积累了一些编程python的经验以后,我发现我渐渐爱上了python,爱上了编程! 接下来,当然是又一些有趣的 ...

  9. Android开发-各种各样好看漂亮的进度条,指示器,加载提示汇总

    导读:之前项目中用到一些进度条,找了不少,打算写个demo自己总结一下,留着以后用, 有些是自己写的,有些是github上找的别人的库,如果大家觉得好看可以用,直接下载复制代码到项目里就可以用,ok ...

随机推荐

  1. PHP1.6--数组

    一.数组的键值操作函数 1.array_values() 函数作用是返回数组中所有元素的值,只有一个参数,规定传人给定数组,返回一个包含给定数组中所有值的数组,但不保留键名 被返回的数组将使用顺序的数 ...

  2. chrome屏蔽https广告

    “设置” -> “高级” -> 系统/“打开代理设置” -> “安全” -> “受限站点” -> “添加” 好了

  3. 基于RBAC权限管理的后台管理系统

    在摸爬滚打中渐渐理解了RBAC权限管理是个什么玩意. RBAC的基本概念: **RBAC认为权限授权实际上是Who.What.How的问题.在RBAC模型中,who.what.how构成了访问权限三元 ...

  4. Zigbee安全入门(一)—— 技术介绍和安全策略

    么是Zigbee? Zigbee说白了就是类似wifi.蓝牙的一种交换数据的方式,学术点说就是低成本.用于低功耗嵌入式设备(无线电系统),用以促进机器与机器之间高效且有效通信(通常相距10-100米) ...

  5. Oil Deposits HDU - 1241 (dfs)

    Oil Deposits HDU - 1241 The GeoSurvComp geologic survey company is responsible for detecting undergr ...

  6. java数字金额转中文大写

    package com.example.convert; import java.text.DecimalFormat; import java.util.Scanner; /** * 金额转换 * ...

  7. linux系统服务

    系统服务分类,根据其使用的方法来分,可以被分为三类 a.由init控制的服务:基本都是系统级别的服务,运行级别这一章讲的就是这一类的服务 b.由System V启动脚本启动的服务:和我们打交道最多的一 ...

  8. 区间加值,区间gcd, 牛客949H

    牛客小白月赛16H 小阳的贝壳 题目链接 题意 维护一个数组,支持以下操作: 1: 区间加值 2: 询问区间相邻数差的绝对值的最大值 3: 询问区间gcd 题解 设原数组为\(a\), 用线段树维护\ ...

  9. NPOI 1.0

    1 应用组件 using NPOI.SS.UserModel; using NPOI.HSSF.Util; 2.一个简单demo    2.1 定义单元格常用到样式的枚举 public enum st ...

  10. hdu 3791 二叉搜索树(数据结构)

    二叉搜索树 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...