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. Cron表达式及其使用注意事项

    Cron表达式简介 Cron表达式全程Crontab表达式,是描述Crontab定时任务执行周期的一种语法格式.而Cron表达式严格上来说有许多特别的版本.如:Linux的.Spring的.Quart ...

  2. IIS 部署asp.net Core程序注意事项

    Install the .NET Core Windows Server Hosting bundle Install the.NET Core Runtime 修改应用程序池的.net framew ...

  3. mysql5.6创建账户不能本地登录

    1.通过xshell连接linux,命令登录mysql 2.创建一个新的库(其实创建不创建都可以) 3.创建账号权限 创建账号luffy 密码luffy 针对库luffy所有权限,允许任何人远程登录 ...

  4. Docker+JMeter+InfluxDB+Grafana从容器内部发起压测

    1.自由定制JMeter镜像: Dockerfile文件: FROM java:8# 基础镜像 MAINTAINER yangjianliang <526861348@qq.com># 作 ...

  5. AcWing 1014. 登山

    #include<iostream> using namespace std ; ; int f[N],g[N]; int w[N]; int main() { int n; cin> ...

  6. Consider using the `--user` option or check the permissions.

    安装pip install C:\Users\道路\Documents\EGDownloads\pip-1.0.tar.gz 报错:Consider using the `--user` option ...

  7. ORA-01843: not a valid month

    问题描述 ORA-01843: not a valid month oracle数据库插入出现无效的月份

  8. TD - setAttribute()

    添加指定的属性,并为其赋指定的值 this.sltLevelType.setAttribute("height", "100px");

  9. Python_递归函数

    楔子 在讲今天的内容之前,我们先来讲一个故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙 ...

  10. 【算法学习记录-排序题】【PAT A1062】Talent and Virtue

    About 900 years ago, a Chinese philosopher Sima Guang wrote a history book in which he talked about ...