多线程学习笔记(二) BackgroundWorker 和 ProgressChanged
BackgroundWorker是在内部使用了线程池的技术;同时,在Winform 或WPF编码中,它还给工作线程和UI线程提供了交互的能力。
Thread和ThreadPool默认都没有提供这种交互能 力,而BackgroundWorker却通过事件提供了这种能力。这种能力包括:报告进度、支持完成回调、取消任务、暂停任务等。
一般而言,无特殊需要的,优先考虑使用标准的backgroundworker
再加上线程池,多数问题都能应付了
只有特别需要精确控制或性能的才用thread
BackgroundWorker会在主线程之外,另开一个后台线程,
我们可以把一些处理放在后台线程中处理,完成之后,后台线程会把结果传递给主线程,同时结束自己。
如果要显示进度,比如我们希望走马灯式更新label,就要把 bw.WorkerReportsProgress = true;
如果要支持中途取消, 则把bw.WorkerSupportsCancellation = true;
private void button3_Click(object sender, EventArgs e)
{
using (BackgroundWorker bw = new BackgroundWorker())
{
bw.WorkerReportsProgress = true;
bw.ProgressChanged += bw_ProgressChanged;
bw.RunWorkerCompleted += bw_RunWorkerCompleted;
bw.DoWork += bw_DoWork; //允许用户指定显示数据的范围呢!所以需要把100作为参数传递给计算过程
bw.RunWorkerAsync();
} }
//这时返回了主线程,所以可以直接使用UI控件了
void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//修改进度条的显示。
//this.progressBarSum.Value = e.ProgressPercentage; //如果有更多的信息需要传递,可以使用 e.UserState 传递一个自定义的类型。
//这是一个 object 类型的对象,您可以通过它传递任何类型。
//我们仅把当前 sum 的值通过 e.UserState 传回,并通过显示在窗口上。
string message = e.UserState.ToString();
label1.Text = message;
}
//e.Argument=bw.RunWorkerAsync("Hello World")的参数
void bw_DoWork(object sender, DoWorkEventArgs e)
{
System.Diagnostics.Debug.WriteLine("bw_DoWork");
BackgroundWorker bgWorker = sender as BackgroundWorker;
//这里的操作是在另一个线程上完成的,不应该操作UI
//在这里执行耗时的运算。 int endNumber = ;
if (e.Argument != null)
{
endNumber = (int)e.Argument;
} for (int i = ; i <= endNumber; i++)
{
bgWorker.ReportProgress(i, "current num:" + i.ToString());
Thread.Sleep(); //为了方便演示
} }
//这时后台线程已经完成,并返回了主线程,所以可以直接使用UI控件了
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
System.Diagnostics.Debug.WriteLine("bw_RunWorkerCompleted");
if (e.Error == null)
lblMsg.Text = "正常结束";
else
lblMsg.Text = "异常结束"+ e.Error.Message;
}
参考: https://www.cnblogs.com/sparkdev/p/5906272.html
https://www.cnblogs.com/luminji/archive/2011/05/13/2044801.html
https://www.cnblogs.com/happy555/archive/2007/11/07/952315.html
https://www.cnblogs.com/grenet/archive/2011/12/21/2289014.html
我所知道的.NET异步 https://www.cnblogs.com/scy251147/archive/2012/03/03/2378477.html
支持暂停操作的Backgroundworker https://www.cnblogs.com/chenxizhang/archive/2010/03/13/1685209.html
多线程学习笔记(二) BackgroundWorker 和 ProgressChanged的更多相关文章
- 多线程学习笔记(三) BackgroundWorker 暂停/继续
BackgroundWorker bw; private ManualResetEvent manualReset = new ManualResetEvent(true); private void ...
- 多线程学习笔记二之JUC组件
目录 概述 JUC锁框架图 使用内置锁还是JUC显示锁? 概述 为了对共享资源提供更细粒度的同步控制,JDK5新增了java.util.concurrent(JUC)并发工具包,并发包新增了Loc ...
- java多线程学习笔记——详细
一.线程类 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...
- JAVA多线程学习笔记(1)
JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...
- muduo学习笔记(二)Reactor关键结构
目录 muduo学习笔记(二)Reactor关键结构 Reactor简述 什么是Reactor Reactor模型的优缺点 poll简述 poll使用样例 muduo Reactor关键结构 Chan ...
- Java多线程学习笔记(一)——多线程实现和安全问题
1. 线程.进程.多线程: 进程是正在执行的程序,线程是进程中的代码执行,多线程就是在一个进程中有多个线程同时执行不同的任务,就像QQ,既可以开视频,又可以同时打字聊天. 2.线程的特点: 1.运行任 ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
随机推荐
- Python—其它模块
系统监控模块psutil(第三方模块) psutil是一个跨平台的库,用于在Python中检索系统运行的进程和系统利用率(CPU,内存,磁盘,网络,传感器)的信息.它主要用于系统监控,性能分析,进程管 ...
- emacs bookmark(书签)初次使用
emacs bookmark(书签)初次使用 编辑或者查看多个文件的时候,要想记住刚才在什么地方进行编辑,是很难的.所以emacs的bookmark功能就登场了.你可以在文件的任何地方设置一个书签,然 ...
- mysql里面alter的用法
1:删除列 ALTER TABLE [表名字] DROP [列名称] 2:增加列 ALTER TABLE [表名字] ADD [列名称] INT NOT NULL COMMENT '注释说明' 3: ...
- 《RocketMQ》
作为一款消息中间件,RocketMQ需要解决的技术问题其实在分布式系统领域中都有所体现.首先如果将分布式系统的领域按照分布式通信.分布式存储.分布式计算以及分布式管理这四大部分进行划分,其实就会发现在 ...
- git使用遇到问题1
1.上传代码过程中遇到 git help gc错误解决方法,有两种方式,推荐第一种方式. $ git fsck $ git gc --prune=now 如果执行完上面的命令还是不行的话,可以尝试删掉 ...
- arduino (2) 浊度传感器
z https://detail.tmall.com/item.htm?id=601391726801&spm=a1z09.2.0.0.60082e8dMiX0LM&_u=e1qf7b ...
- MySQL实战45讲学习笔记:第三十五讲
一.本节概述 在上一篇文章中,我和你介绍了 join 语句的两种算法,分别是 Index Nested-LoopJoin(NLJ) 和 Block Nested-Loop Join(BNL). 我们发 ...
- 第四组 团队Git现场编程实战
组员职责分工 组员 分工 林涛(组长) 分配任务.整理数据.写博客 童圣滔 UI界面制作 林红莲 UI界面制作 潘雨佳 测评出福州最受欢迎的商圈 于瀚翔 测评出福州最受欢迎的商圈 覃鸿浩 测评出福州人 ...
- CentOS6.9安装SonarQube7.6
1 安装前准备 Java (Oracle JRE 8 or OpenJDK 8) MySQL5.6 or MySQL5.7,具体可参考Centos6.9安装MySQL5.6 SonarQube7.6, ...
- 【转】np.random.random()函数 参数用法以及numpy.random系列函数大全
转自:https://www.cnblogs.com/DOMLX/p/9751471.html 1.np.random.random()函数参数 np.random.random((1000, 20) ...