winform BackgroundWorker 的用法 - 异步执行
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 的用法 - 异步执行的更多相关文章
- C# Winform 基于Task的异步与延时执行
一.Task的机制 Task位于命名空间System.Threading.Tasks中,是.NET 4.0加入的新模块,其实现机制大致类似于线程池ThreadPool,不过对于ThreadPool ...
- 【转】WPF 异步执行方法后对 UI 进行更新的几种方法
使用 async/await 的情况: private async void Button_Click(object sender, RoutedEventArgs e) { (sender as B ...
- 在UI程序设计中使用BackgroundWorker进行多线程异步处
WinForm的应用程序中如果执行了一个的非常冗长的处理操作,(比如文件检索,大运算量计算),在执行时就会锁定用户界面,虽然主活动窗口还在运行,但用户无法与程序交互,无法移动窗体或改变窗体大小,导致程 ...
- C#.NET使用Task,await,async,异步执行控件耗时事件(event),不阻塞UI线程和不跨线程执行UI更新,以及其他方式比较
使用Task,await,async,异步执行事件(event),不阻塞UI线程和不跨线程执行UI更新 使用Task,await,async 的异步模式 去执行事件(event) 解决不阻塞UI线程和 ...
- HTML 5 <script> async 属性简单设置代码异步执行
HTML5中 script标签支持脚本的异步执行async.脚本将会异步运行: <script type="text/javascript" src="demo_a ...
- PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)
源码地址:https://github.com/Tinywan/PHP_Experience 测试环境配置: 环境:Windows 7系统 .PHP7.0.Apache服务器 PHP框架:ThinkP ...
- asap异步执行实现原理
目录 为什么分析asap asap概述 asap源码解析-Node版 参考 1.为什么分析asap 在之前的文章 async和await是如何实现异步编程? 中的浅谈Promise如何实现异步执行小节 ...
- springboot:嵌套使用异步注解@Async还会异步执行吗
一.引言 在前边的文章<[springboot:使用异步注解@Async的那些坑>中介绍了使用@Async注解获取任务执行结果的错误用法,今天来分享下另外一种常见的错误. 二.代码演示 下 ...
- Java使用多线程异步执行批量更新操作
import com.google.common.collect.Lists; import org.apache.commons.collections.CollectionUtils; impor ...
随机推荐
- Qt VS Tools插件官方下载及安装
下载 官方下载地址:https://download.qt.io/development_releases/vsaddin/(国外网站直接打开超级慢) 找到对应的VS版本下载 安装 下载完成后安装,打 ...
- 手机内存卡RAW无法格式化的解决办法
突然出现这个问题,这是麻烦: 网上找了各种办法:什么软件修复,disk等修复,创建新磁盘,新扇到,win自动修复啊:开始----运行框中输入 :convert X: /fs:FAT(X为电脑 ...
- Codeforces Round #601 (Div. 2) B Fridge Lockers
//题目要求的是每一个点最少要有两条边连接,所以可以先构成一个环.然后再把剩余的最短的边连接起来 #include<iostream> #include<algorithm> ...
- css样式读取
在做页面改写时,发现外部引入的样式表中一部分的样式起作用,另一部分的样式没有用.无论怎么修改都没有用.最后搜索了下答案,发现是css样式文件与需引入的文件编码不一致.导致样式读取不到或者读取到一半.
- Mysql高级操作
多数据插入 insert into 表名 [(字段名)] values(值列表1),(值列表2),... 主键冲突 主键冲突更新 主键冲突时,更新数据 insert into 表名 [(字段列表)] ...
- 用eclipse中自带的jetty启动项目
1.建立datasources.xml,创建jndi <jee:jndi-lookup id="datasource" jndi-name="jndiname&qu ...
- 九、c++容器
9.1 简介 容器库是类模板与算法的汇集,允许程序员简单地访问常见数据结构,例如队列.链表和栈. 有三类容器--顺序容器.关联容器和无序关联容器--每种都被设计为支持不同组的操作. 顺序容器:顺序容器 ...
- spring(三):ApplicationContext
- 请求响应状态status为canceled
发出ajax请求之后 发现status状态是canceled 1. 和form冲突 我的提交代码是这样的 $.ajax({ //几个参数需要注意一下 type: "POST",// ...
- 安装pecl
$ wget http://pear.php.net/go-pear.phar $ php go-pear.phar //php版本 < 7 $ yum install php-pear // ...