多线程学习笔记(二) BackgroundWorker 和 ProgressChanged
时间:2019-09-17
本文章向大家介绍多线程学习笔记(二) BackgroundWorker 和 ProgressChanged,主要包括多线程学习笔记(二) BackgroundWorker 和 ProgressChanged使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
BackgroundWorker会在主线程之外,另开一个后台线程,
我们可以把一些处理放在后台线程中处理,完成之后,后台线程会把结果传递给主线程,同时结束自己。
如果要显示进度,比如我们希望走马灯式更新label,就要把 bw.WorkerReportsProgress = 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(100); } } //这时返回了主线程,所以可以直接使用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 = 0; if (e.Argument != null) { endNumber = (int)e.Argument; } for (int i = 0; i <= endNumber; i++) { bgWorker.ReportProgress(i, "current num:" + i.ToString()); Thread.Sleep(50); //为了方便演示 } } //这时后台线程已经完成,并返回了主线程,所以可以直接使用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/zitjubiz/p/11532501.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- android九宫格可分页加载控件使用详解
- WordPress用插件实现MarkDown语法支持
- Android中实现长按照片弹出右键菜单功能的实例代码
- Android Studio无法执行Java类的main方法问题及解决方法
- PlayTube优秀的视频CMS系统/支持本地和youtube导入
- Android Studio 中运行 groovy 程序的方法图文详解
- android studio按钮监听的5种方法实例详解
- AndroidStudio3.6.1打包jar及AndroidStudio4.0打包jar的一系列问题及用法
- 教你如何在js中split函数分割字符串为数组
- [折腾]小型HTTP web服务Caddy及配置PHP
- graftcp一种把指定程序的 TCP 流量重定向到代理的方法
- Flutter应用集成极光推送的实现示例
- android调用C语言实现内存的读取与修改的方法示例
- Android中网络框架简单封装的实例方法
- Auto Remove Torrents:自动删种程序部署