1.设置 
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;

2说明:

开始函数:

(1) backgroundWorker1.RunWorkerAsync(参数a),触发DoWork事件,见参数a传给事件的DoWorkEventArgs参数(用e.Argument接收参数)。

在dowork事件中进行函数体操作,在实践中用ReportProgress(参数1,或者参数2)方法,将会触发ProgressChanged事件

(2)在ProgressChanged事件中,ProgressChangedEventArgs参数可以接收ReportProgress()方法的两个参数,然后进行相应的操作

(3)无论是中止还是终止BackgroundWorker线程。都会执行RunWorkerCompleted事件。

(4)所以,事件的顺序是 backgroundWorker1.RunWorkerAsync(参数a)-->DoWork事件-->ProgressChanged事件-->RunWorkerCompleted事件.

3中止BackgroundWorker

用 backgroundWorker1.CancelAsync()方法,但是此时并没有中止线程,只是将backgroundWorker1.CancellationPending改为true。此时需要在执行的事件中来判断backgroundWorker1.CancellationPending的值进行终止操作。

4案例

using System;
using System.ComponentModel;
using System.Threading;
using System.Windows.Forms; namespace WindowsFormsApp27
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
} private void Form1_Load(object sender, EventArgs e)
{
listView1.FullRowSelect = true;
listView1.GridLines = true;
listView1.Columns.Add("num");
listView1.Columns.Add("name");
listView1.Columns.Add("age");
listView1.Columns.Add("sex"); backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true; }
public delegate void ShowList(int a);
private void button1_Click(object sender, EventArgs e)
{
int num= string.IsNullOrEmpty(textBox1.Text) ? : int.Parse(textBox1.Text); ;
progressBar1.Maximum = num;
button1.Enabled = false;
backgroundWorker1.RunWorkerAsync(num);//引发backgroundWorker1_DoWork_1事件,将参数num以DoWorkEventArgs形式传给事件 } private void ADD(object nm)
{
int num = int.Parse(nm.ToString());
for (int i = ; i < num; i++)
{
ListViewItem li = new ListViewItem() { Text = i.ToString() };
li.SubItems.Add("name" + i);
li.SubItems.Add("age" + i);
li.SubItems.Add("sex" + i);
listView1.Items.Add(li); }
} private void backgroundWorker1_DoWork_1(object sender, DoWorkEventArgs e)
{ object oo = e.Argument;//获取RunWorkerAsync()方法所传递的值
BackgroundWorker bw = sender as BackgroundWorker; int num = int.Parse(oo.ToString());
for (int i = ; i <= num; i++)
{ if (bw.CancellationPending)
{//判断是否要求中止线程
e.Cancel = true;
break;//很重要 } ListViewItem li = new ListViewItem() { Text = i.ToString() };
li.SubItems.Add("name" + i);
li.SubItems.Add("age" + i);
li.SubItems.Add("sex" + i);
bw.ReportProgress(i,li);//触发backgroundWorker1_ProgressChanged_1事件,将参数以ProgressChangedEventArgs格式传给事件。此处的百分数解析并不准确,自己根基实际情况进行计算
Thread.Sleep();
} } private void backgroundWorker1_ProgressChanged_1(object sender, ProgressChangedEventArgs e)
{
BackgroundWorker b = sender as BackgroundWorker;
ListViewItem li = e.UserState as ListViewItem;//接收ReportProgress方法的第二个参数参数值
listView1.Items.Add(li);
progressBar1.Value = e.ProgressPercentage;//接收ReportProgress方法的第一个参数参数值
label1.Text = (e.ProgressPercentage*/progressBar1.Maximum).ToString();
} //无论是中止还是终止,都执行该事件
private void backgroundWorker1_RunWorkerCompleted_1(object sender, RunWorkerCompletedEventArgs e)
{ if (e.Error != null)
{
MessageBox.Show(e.Error.ToString());
}
else if (e.Cancelled)
{
MessageBox.Show(e.Cancelled.ToString());
}
else
{
MessageBox.Show("ok了");
}
button1.Enabled = true;
} private void button2_Click(object sender, EventArgs e)
{
backgroundWorker1.CancelAsync();//此处并不是真正的中止线程,只是将backgroundWorker1.CancellationPending的值设置成了true,需要在dowork事件(即所进行的操作的函数体中)进行判断,再跳出函数(break)。 }
}
}

winform BackgroundWorker 的用法 - 异步执行的更多相关文章

  1. C# Winform 基于Task的异步与延时执行

    一.Task的机制   Task位于命名空间System.Threading.Tasks中,是.NET 4.0加入的新模块,其实现机制大致类似于线程池ThreadPool,不过对于ThreadPool ...

  2. 【转】WPF 异步执行方法后对 UI 进行更新的几种方法

    使用 async/await 的情况: private async void Button_Click(object sender, RoutedEventArgs e) { (sender as B ...

  3. 在UI程序设计中使用BackgroundWorker进行多线程异步处

    WinForm的应用程序中如果执行了一个的非常冗长的处理操作,(比如文件检索,大运算量计算),在执行时就会锁定用户界面,虽然主活动窗口还在运行,但用户无法与程序交互,无法移动窗体或改变窗体大小,导致程 ...

  4. C#.NET使用Task,await,async,异步执行控件耗时事件(event),不阻塞UI线程和不跨线程执行UI更新,以及其他方式比较

    使用Task,await,async,异步执行事件(event),不阻塞UI线程和不跨线程执行UI更新 使用Task,await,async 的异步模式 去执行事件(event) 解决不阻塞UI线程和 ...

  5. HTML 5 <script> async 属性简单设置代码异步执行

    HTML5中 script标签支持脚本的异步执行async.脚本将会异步运行: <script type="text/javascript" src="demo_a ...

  6. PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)

    源码地址:https://github.com/Tinywan/PHP_Experience 测试环境配置: 环境:Windows 7系统 .PHP7.0.Apache服务器 PHP框架:ThinkP ...

  7. asap异步执行实现原理

    目录 为什么分析asap asap概述 asap源码解析-Node版 参考 1.为什么分析asap 在之前的文章 async和await是如何实现异步编程? 中的浅谈Promise如何实现异步执行小节 ...

  8. springboot:嵌套使用异步注解@Async还会异步执行吗

    一.引言 在前边的文章<[springboot:使用异步注解@Async的那些坑>中介绍了使用@Async注解获取任务执行结果的错误用法,今天来分享下另外一种常见的错误. 二.代码演示 下 ...

  9. Java使用多线程异步执行批量更新操作

    import com.google.common.collect.Lists; import org.apache.commons.collections.CollectionUtils; impor ...

随机推荐

  1. Spring与RestHighLevelClient

    Elasticsearch连接方式有两种:分别为TCP协议与HTTP协议 最近使用es比较多,之前使用一直是使用spring封装的spring-data-elasticsearch:关于spring- ...

  2. Redis到底是多线程还是单线程?线程安全吗,还需要加锁吗?

    0. redis单线程问题 单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程. 1. 为什么说redis能够快速执行 (1) 绝大部 ...

  3. hdu1716--全排列(dfs+有重复数字+输出格式)

    Ray又对数字的列产生了兴趣: 现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数.  Input每组数据占一行,代表四张卡片上的数字(0<=数字<=9 ...

  4. 巨杉Tech | 十分钟快速搭建 Wordpress 博客系统

    介绍 很多互联网应用程序开发人员第一个接触到的网站项目就是博客系统.而全球使用最广的Wordpress常常被用户用来快速搭建个人博客网站.默认情况下,Wordpress一般在后台使用MySQL关系型数 ...

  5. DataPipeline王睿:业务异常实时自动化检测 — 基于人工智能的系统实战

    大家好,先自我介绍一下,我是王睿.之前在Facebook/Instagram担任AI技术负责人,现在DataPipeline任Head of AI,负责研发企业级业务异常检测产品,旨在帮助企业一站式解 ...

  6. Freezable 对象概述 | Microsoft Docs

    原文:Freezable 对象概述 | Microsoft Docs Freezable 对象概述Freezable Objects Overview 2017/03/30 本文内容 什么是可冻结的? ...

  7. Django | pycharm 提示 unresolved attribute referene 'objects' for class 'xxxx'

    objects高亮,提示信息为unresolved attribute referene 'objects' for class 'BookInfo' 当前情况是pycharm没有识别到objects ...

  8. Day1 工厂模式

    我的理解就是:工厂模式可以不用在乎参数的类型,工厂函数根据不同的类型,创建不同的对象.如下(简单工厂): package method.simpleFactory; import java.util. ...

  9. mysql数据库测试脚本

    背景: 对mysql的底层代码进行了重构,需要回归测试mysql的基本功能 测试目标: 涵盖功能点如下 1.创建库,删除库,重命名库 2.创建表(需要涵盖所有基本的数据类型,主键,自增,默认值,不允许 ...

  10. 记录 shell学习过程(3) if 的格式

    ] #-e 为检测目录或文件是否存在 !为取反 then mkdir -v /tmp/ echo 'ok' fi if else if [ $USER == 'root' ] then echo 'h ...