C#在后台运行操作:BackgroundWorker的用法
在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示,必要时还要控制后台线程中断当前操作。
以前,类似的应用会比较麻烦,需要写的代码较多,也很容易出现异常。在.net中,提供了一个组件BackgroundWorker就是专门解决这个问题的。BackgroundWorker类允许在单独的专用线程上运行操作。 耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面(UI)似乎处于停止响应状态。如果需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用BackgroundWorker类方便地解决问题。
使用这个组件其实非常简单,例如,我们做一个类似如下界面的进度条的小例子,在后台线程中进行耗时运算,同时刷新界面上的进度条。
过程如下:
1.新建一个windows窗体应用程序,如:BackgroundWorkerProgressBarDemo
2.拖一个ProgressBar(progressBar1)和一个BackgroundWorker (backgroundWorker1)到Form上。
3.把下面的代码copy过去就ok了,代码注释的很详细,可以按照需要修改。
namespace BackgroundWorkerProgressBarDemo {public partial class Form1 : Form{public Form1(){InitializeComponent();Shown += new EventHandler(Form1_Shown);// To report progress from the background worker we need to set this propertybackgroundWorker1.WorkerReportsProgress = true;// This event will be raised on the worker thread when the worker startsbackgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);// This event will be raised when we call ReportProgressbackgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);}void Form1_Shown(object sender, EventArgs e){// Start the background worker backgroundWorker1.RunWorkerAsync();}// On worker thread so do our thing!void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e){// Your background task goes herefor (int i = 0; i <= 100; i++){// Report progress to 'UI' thread backgroundWorker1.ReportProgress(i);// Simulate long taskSystem.Threading.Thread.Sleep(100);}}// Back on the 'UI' thread so we can update the progress barvoid backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e){// The progress percentage is a property of eprogressBar1.Value = e.ProgressPercentage;}} }
若要为后台操作做好准备,请添加DoWork事件的事件处理程序,在此事件处理程序中调用耗时的操作。
若要开始此操作,请调用RunWorkerAsync。
若要收到进度更新的通知,请处理ProgressChanged 事件。
若要在操作完成时收到通知,请处理RunWorkerCompleted 事件。
注意:
您必须非常小心,确保在 DoWork 事件处理程序中不操作任何用户界面对象。 而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。
BackgroundWorker 事件不跨 AppDomain 边界进行封送处理。 请不要使用 BackgroundWorker 组件在多个 AppDomain 中执行多线程操作。
如果后台操作需要参数,请在调用 RunWorkerAsync 时给出参数。 在 DoWork 事件处理程序内部,可以从 DoWorkEventArgs.Argument 属性中提取该参数。
参考:
http://msdn.microsoft.com/zh-cn/library/vstudio/System.ComponentModel.BackgroundWorker(v=vs.100).aspx
转载于:https://www.cnblogs.com/ChineseMoonGod/p/5254502.html
C#在后台运行操作:BackgroundWorker的用法相关推荐
- Linux后台运行任务nohup结合用法以及如何精准查找进程并kill后台任务实践
转自 https://segmentfault.com/a/1190000021265829?hmsr=toutiao.io&utm_medium=toutiao.io&utm_sou ...
- window如何杀掉java进程_windows下java -jar 后台运行以及杀死后台进程的操作
在你的jar文件当前目录中建立一个bat文件: 内容是:注意文件名要对应 @echo off START "commandServer" javaw -jar command-0. ...
- 【Linux系统理论操作学习26】LInux的后台运行,重定向输出,前后台进程转换和管理
1 输出的后台运行 1.1 简单后台运行 nohup表示程序不被挂起 &表示后台运行程序 如果说使用&,就会出现问题:后台执行的进程,其父进程还是当前终端shell的进程,而一旦父进程 ...
- windows下java -jar 后台运行以及杀死后台进程的操作
这篇文章主要介绍了windows下java -jar 后台运行以及杀死后台进程的操作,具有很好的参考价值,希望对大家有所帮助. 在你的jar文件当前目录中建立一个bat文件: 内容是:注意文件名要对应 ...
- Linux 后台运行python .sh等程序,以及查看和关闭后台运行程序操作
1.运行.sh文件 直接用./sh 文件就可以运行,但是如果想后台运行,即使关闭当前的终端也可以运行的话,需要nohup命令和&命令. (1)&命令 功能:加在一个命令的最后,可以把这 ...
- Spring Boot项目(Maven\Gradle)三种启动方式及后台运行详解
Spring Boot项目三种启动方式及后台运行详解 1 Spring Boot项目三种启动方法 运行Application.java类中的Main方法 项目管理工具启动 Maven项目:mvn sp ...
- Linux 后台运行程序方法总结
在用服务器跑数据的时候经常会遇到数据量大,速度慢的情况,动不动需要用好几天甚至上十天,但电脑总不能好几天不关终端,且保证不断网吧.所以这时候我们就需要将程序放到后台运行,不依赖于终端.关于原理,我 ...
- Linux学习之后台运行进程
前言 有的时候我们希望Linux的命令行能运行一个程序,然后把它放在后台,让其自己运行,尤其是云服务器运行单线程程序,TCP服务器开启一个while(true)循环监听一个端口,这时命令行就死在那等着 ...
- linux nohup 后台运行
在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台: /usr/local/mysql/bin/my ...
最新文章
- [HNOI2008 GT考试]
- assert()函数用法总结——转
- 用化学的方法分类键盘和鼠标
- Centos7 Git源码安装
- IE Firefox css 差别 [转]
- css3修改透明png颜色
- 吴伯凡-认知方法论-原始舒适区=0认知
- 滚动交互引导界面的Ouroboros
- matlab模糊优选理论模型,模糊优选神经网络BP模型
- 查看kafka的版本
- 推荐几个帮你避坑和赚钱的公众号
- 【力扣】695岛屿的最大面积
- Unity3D网络游戏实战——通用服务器框架
- connection_reset解决方案
- erp系统的服务器如何配置,erp系统云服务器怎么配置
- Elasticsearch 快照生命周期管理 (SLM) 实战指南
- 计算机过去.现在的技术发展,影像技术与设备的过去,现在与未来
- “今日头条”发展困境与未来发展策略
- H3C S5500-52C-EI 配置远程登录
- Node.js_assert
热门文章
- Python之路,day3-Python基础
- Linq to sql与EF零碎知识点总结
- [转载]Shark Machine Learning Library --之运行篇
- C#实现文本文件合并
- OpenCV中# define CV_EXPORTS __declspec(dllexport)的含义
- leetcode算法题--链表中倒数第k个节点
- leetcode算法题--删除链表的倒数第N个节点
- leetcode算法题--掷骰子模拟★★
- leetcode算法题--出界的路径数★
- python调用数据库存储过程_python连接mysql调用存储过程示例