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. Django项目:CRM(客户关系管理系统)--19--11PerfectCRM实现King_admin分页显示条数

    登陆密码设置参考 http://www.cnblogs.com/ujq3/p/8553784.html list_per_page = 2 #分页条数 list_per_page = 2 #分页条数 ...

  2. CF549G Happy Line

    传送门 解题思路 题意大概就是给你个数列,你可以随意交换i,i+1,交换后位于第i+1位的数字+1,位于第i位的数字-1,问最终能否形成一个不下降序列并输出.设初始数列中两个位置x,y最终交换后的位置 ...

  3. Cannot allocate memory for the buffer pool

    优化了一通,启动不了 直接上日志 innodb_buffer_pool_size”.”key_buffer_size” 的大小设置,适当的调大内存分配,减小,然后保存配置文件,重新尝试启mysql 成 ...

  4. matplotlib无法显示中文

    import matplotlib as mpl mpl.rcParams['font.sans-serif'] = ['KaiTi']mpl.rcParams['font.serif'] = ['K ...

  5. java-Map-system

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

  6. c++的引用用法

    一.引用简介 引用就是某一变量(目标)的一个别名,对引用的操作与对变量的直接操作完全一样. 引用的声明方法:类别标识符&引用名=目标变量名: 例1: int a; int &ra=a; ...

  7. WPF:数据绑定总结(1) https://segmentfault.com/a/1190000012981745

    WPF:数据绑定总结(1) visual-studio c# 1.3k 次阅读  ·  读完需要 16 分钟 0 一.概念:什么是数据绑定? WPF中的数据绑定:是在应用程序 UI 与业务逻辑之间建立 ...

  8. NFS客户端挂载目录后无写入权限的解决方案

    转载至:https://blog.csdn.net/younger_china/article/details/52089337 在客户机通过 mount -o rw -t nfs 192.168.1 ...

  9. 将CMD命令提示符的起始位置进行更改 / CMD起始位置发生改变后如何修改回来

    具体步骤如下: 1.首先我们需要先找到命令提示符所在的文件目录.可以在开始运行程序中输入CMD,一般回自动搜索匹配. 2.右键点击命令提示符,在弹出菜单中,选择“打开文件位置”: 3.然后我们就可以进 ...

  10. oracle误操作commit之后,可以闪回数据

    1. 授予行迁移权限 alter table table_name enable row movement; 2. 到15分钟前: flashback table order   to timesta ...