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. js作用域的销毁、不立即销毁、不销毁

    JavaScript中的函数执行会形成私有的作用域. (1)作用域的销毁 一般情况下,函数执行形成一个私有的作用域,当执行完成后就销毁了->节省内存空间 (2)作用域的不立即销毁 functio ...

  2. JavaScript多继承(转载)

    js里是否有多继承,如何实现多继承.在这里可以看看java是如何处理多继承的问题,java里是没有多继承的,即一个子类不能同时继承多个父类,但可以实现多个接口,这也间接的实现了多继承.主要是因为多继承 ...

  3. 学习Web前端开发时有哪些技术点

    现在学前端的人是越来越多,学习质量也是参差不齐.过来人的身份告诉你,如果你还没有下定决心花时间去学习Web前端,那也可以先找些视频学习下,Web前端开发有哪些常见技术点!接下来,就看看Web前端开发有 ...

  4. HTML 和 XHTML 区别

    1.初级改善 为页面添加正确的DOCTYPE 很多设计师和开发者都不知道什么是DOCTYPE,DOCTYPE有什么用. DOCTYPE是document type的简写.主要用来说明你用的XHTML或 ...

  5. 下载android4.4.2源代码全过程(附已下载的源代码)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/maosidiaoxian/article/details/36625727 今天在下载andriod ...

  6. Python学习(一) 安装,环境搭建,IDE

    第一篇废话太多了,我的博客最主要的是给自己看的,大家觉得还凑合也可以看看,能说自己想法的就更好了,因为一个人的思想是有局限性的.集思广益,自己的认知才不会被禁锢. 注:其他的系统没装,在Windows ...

  7. java-Map-system

    一 概述 0--星期日1--星期一... 有对应关系,对应关系的一方是有序的数字,可以将数字作为角标. public String getWeek(int num){ if(num<0 || n ...

  8. Js 克隆

    1.浅表克隆 调用concate() 或者slice() 方法,可以创建数组的浅表副本,在浅表副本中,如果原始数组的元素是复杂数据类型,则元素值指向对象的引用而非对象本身, 与原始数组一样,浅表副本的 ...

  9. 深入剖析Redis RDN持久化机制

    rdb是redis保存内存数据到磁盘数据的其中一种方式(另一种是AOF).Rdb的主要原理就是在某个时间点把内存中的所有数据的快照保存一份到磁盘上.在条件达到时通过fork一个子进程把内存中的数据写到 ...

  10. Java开发中的Memcache原理及实现

    Memcached 客户端程序 Memcached的java客户端已经存在三种了: ?  官方提供的基于传统阻塞io由Greg Whalin维护的客户端 ?  Dustin Sallings实现的基于 ...