在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示,必要时还要控制后台线程中断当前操作。

以前,类似的应用会比较麻烦,需要写的代码较多,也很容易出现异常。在.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的用法相关推荐

  1. Linux后台运行任务nohup结合用法以及如何精准查找进程并kill后台任务实践

    转自 https://segmentfault.com/a/1190000021265829?hmsr=toutiao.io&utm_medium=toutiao.io&utm_sou ...

  2. window如何杀掉java进程_windows下java -jar 后台运行以及杀死后台进程的操作

    在你的jar文件当前目录中建立一个bat文件: 内容是:注意文件名要对应 @echo off START "commandServer" javaw -jar command-0. ...

  3. 【Linux系统理论操作学习26】LInux的后台运行,重定向输出,前后台进程转换和管理

    1 输出的后台运行 1.1 简单后台运行 nohup表示程序不被挂起 &表示后台运行程序 如果说使用&,就会出现问题:后台执行的进程,其父进程还是当前终端shell的进程,而一旦父进程 ...

  4. windows下java -jar 后台运行以及杀死后台进程的操作

    这篇文章主要介绍了windows下java -jar 后台运行以及杀死后台进程的操作,具有很好的参考价值,希望对大家有所帮助. 在你的jar文件当前目录中建立一个bat文件: 内容是:注意文件名要对应 ...

  5. Linux 后台运行python .sh等程序,以及查看和关闭后台运行程序操作

    1.运行.sh文件 直接用./sh 文件就可以运行,但是如果想后台运行,即使关闭当前的终端也可以运行的话,需要nohup命令和&命令. (1)&命令 功能:加在一个命令的最后,可以把这 ...

  6. Spring Boot项目(Maven\Gradle)三种启动方式及后台运行详解

    Spring Boot项目三种启动方式及后台运行详解 1 Spring Boot项目三种启动方法 运行Application.java类中的Main方法 项目管理工具启动 Maven项目:mvn sp ...

  7. Linux 后台运行程序方法总结

      在用服务器跑数据的时候经常会遇到数据量大,速度慢的情况,动不动需要用好几天甚至上十天,但电脑总不能好几天不关终端,且保证不断网吧.所以这时候我们就需要将程序放到后台运行,不依赖于终端.关于原理,我 ...

  8. Linux学习之后台运行进程

    前言 有的时候我们希望Linux的命令行能运行一个程序,然后把它放在后台,让其自己运行,尤其是云服务器运行单线程程序,TCP服务器开启一个while(true)循环监听一个端口,这时命令行就死在那等着 ...

  9. linux nohup 后台运行

    在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台: /usr/local/mysql/bin/my ...

最新文章

  1. [HNOI2008 GT考试]
  2. assert()函数用法总结——转
  3. 用化学的方法分类键盘和鼠标
  4. Centos7 Git源码安装
  5. IE Firefox css 差别 [转]
  6. css3修改透明png颜色
  7. 吴伯凡-认知方法论-原始舒适区=0认知
  8. 滚动交互引导界面的Ouroboros
  9. matlab模糊优选理论模型,模糊优选神经网络BP模型
  10. 查看kafka的版本
  11. 推荐几个帮你避坑和赚钱的公众号
  12. 【力扣】695岛屿的最大面积
  13. Unity3D网络游戏实战——通用服务器框架
  14. connection_reset解决方案
  15. erp系统的服务器如何配置,erp系统云服务器怎么配置
  16. Elasticsearch 快照生命周期管理 (SLM) 实战指南
  17. 计算机过去.现在的技术发展,影像技术与设备的过去,现在与未来
  18. “今日头条”发展困境与未来发展策略
  19. H3C S5500-52C-EI 配置远程登录
  20. Node.js_assert

热门文章

  1. Python之路,day3-Python基础
  2. Linq to sql与EF零碎知识点总结
  3. [转载]Shark Machine Learning Library --之运行篇
  4. C#实现文本文件合并
  5. OpenCV中# define CV_EXPORTS __declspec(dllexport)的含义
  6. leetcode算法题--链表中倒数第k个节点
  7. leetcode算法题--删除链表的倒数第N个节点
  8. leetcode算法题--掷骰子模拟★★
  9. leetcode算法题--出界的路径数★
  10. python调用数据库存储过程_python连接mysql调用存储过程示例