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. 3行java代码实现百度站长主动推送

    个人博客 地址:http://www.wenhaofan.com/article/push-link-seo 介绍 当网站新增了一个网页之后,此时这个网页是不能够立马被百度收录的,如果想以最快的速度被 ...

  2. R语言函数话学习笔记5

    使用Tidyverse完成函数化编程 (参考了家翔学长的笔记) 1.magrittr包的使用 里面有很多的管道函数,,可以减少代码开发时间,提高代码可读性和维护性 1.1 四种pipeline 1.1 ...

  3. mybatis(六):设计模式 - 策略模式

  4. 3.获取某天的最大时间和最小时间,使用Calendar

    if (taxTraySummaryListDTO.getStartDate() != null) { Calendar cal = Calendar.getInstance(); cal.setTi ...

  5. python3练习100题——023

    再做一道,把这周的任务搞定- 其实看到这道题,很熟悉,让我想起大一时被C语言支配的恐惧.那个时候不停的在push自己,给自己很大的压力.上C语言课的时候让人昏昏欲睡,但是还是逼迫自己打起精神来学习,一 ...

  6. java fastjson:Map与json以及JSONObject ,JSONObject与String互转

    import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson ...

  7. codeforces div2_603 F. Economic Difficulties(树dfs预处理+dp)

    题目连接:http://codeforces.com/contest/1263/problem/F 题意:有n个设备,上和下分别连接着一颗树,上下两棵树每棵树的叶子节点连接一个设备,两棵树的根节点都是 ...

  8. Elasticsearch集群知识笔记

    Elasticsearch集群知识笔记 Elasticsearch内部提供了一个rest接口用于查看集群内部的健康状况: curl -XGET http://localhost:9200/_clust ...

  9. 同步选中所有checkbox

    $("input[type=checkbox][tag=ckAll]").change(function () $(this).parent().parent().siblings ...

  10. AcWing 895. 最长上升子序列

    //设上升序列的最后一个数字为第i个,那么就以第i-1个位分类标准, //i-1可以没有,也可以是在数组中下标为1,下标为2 //一直到下标为i-1的数字 #include <iostream& ...