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. TZ_16_Vue的idea入门

    1.Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手,还便 ...

  2. IntelliJ IDEA 17 创建maven项目

    参考博客: https://yq.aliyun.com/articles/111053# 部署服务器时  没有Tomcat Server选项

  3. random模块&hashlib模块

    random模块1.random.randrange(1, 10):返回1-10之间的一个随机数,不包括102.random.randint(1,10):返回1-10之间的一个随机数,包括103.ra ...

  4. POJ2182Lost Cows

    Lost Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11946   Accepted: 7690 Descri ...

  5. 【CODEVS】2618 核电站问题

    2618 核电站问题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 一个核电站有N个放核物质的坑,坑排列在一条直 ...

  6. pycharm使用gitlab输错密码解决办法

    在pycharm中使用http方式连接gitlab,在测试连接的时候提示输入用户名,密码.密码输错后,以后的每次test都是使用错误的密码,在删除pycharm后也是一样,解决方法是在控制面板\用户帐 ...

  7. JavaScript文件与HTML文件本地连接

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. PLSql 查询结果让数字显示为字符

    有时候某些地段太长的话就会默认显示为数字,例如ID字段过长就会显示为4.34E23的形式,遇到这样情况如何还原id字段的本身形式呢? Tools-->preference-->SQL Wi ...

  9. C# 通过URL得到图片的问题

    第一个方法在读取某些图片会报错 public static Image get_Fill_image(string url) { var image = new Image(); image.Sour ...

  10. Java项目压力测试(待补)

    JVM监控使用ava自带jvisualvm,在java安装目录jdk1.*/bin下(有很多更高级的东西 线程2000以下,太多切换太消耗.CPU使用率30%以下,更健壮