在Windows Form应用中,BackgroundWorker 类允许您在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。由于操作是异步执行的,用户可能在异步操作执行过程中关闭当前窗体,而窗体的关闭会伴随着Dispose方法的执行。如果我们注册了BackgroundWorker的RunWorkerCompleted事件,并且在该事件处理程序中需要操作这个被Disposed的窗体,就会出现一些无法预知的异常。

一、一个简单的例子

我们写一个简单的例子来说明上述的场景:在一个非主窗体(主窗体的关闭会导致程序的终止)的Windows窗体中,一个BackgroundWorker被用于异步地执行一段耗时的操作。在我们的例子中,通过让线程休眠10秒来模拟这个“耗时操作”。方法backgroundWorker_RunWorkerCompleted是BackgroundWorker的RunWorkerCompleted事件处理方法,在这里我们通过MessageBox来显示当前窗体的IsDisposed属性值。注册到该BackgroundWorker的异步操作通过点击某个按钮开启。相关的代码如下所示。

   1: public partial class BgwForm : Form
   2: {
   3:     public BgwForm()
   4:     {
   5:         InitializeComponent();
   6:     }
   7:  
   8:     private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
   9:     {
  10:         Thread.Sleep(10000);
  11:     }
  12:  
  13:     private void btnStart_Click(object sender, EventArgs e)
  14:     {
  15:         this.backgroundWorker.RunWorkerAsync();
  16:     }
  17:  
  18:     private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  19:     {
  20:         MessageBox.Show(string.Format("Is the form disposed? {0}", this.IsDisposed));
  21:     }
  22: }

当该窗体被显示出来后,点击按钮让注册到该BackgroundWorker的异步操作开始执行,然后在操作结束之前(10秒)将当前窗体关闭。10秒钟之后,如右图所示的一个MessageBox会显示出来,表明在执行BackgroundWorker的RunWorkerCompleted事件处理程序的时候,承载它的窗体已经被Dispose。如果在你将一些针对窗体的操作注册到RunWorkerCompleted事件上,操作一个Disposed窗体,很难保证能否正常进行。而实际上,我们通常注册该事件在窗体上进行一些状态信息的显示,既然窗体都被关闭,这些操作就无需执行。那么,有什么方式可以确保在窗体关闭的状态下阻止RunWorkerCompleted事件处理程序的执行呢?

二、通过IsDisposed属性判断窗体的状态

我们最容易想到的肯定是在RunWorkerCompleted事件处理程序通过窗体的IsDisposed属性判断窗体的状态,并根据状态进行相应的操作。

   1: private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
   2: {
   3:     if (!this.IsDisposed)
   4:     { 
   5:         //Do Something
   6:     }
   7: }

三、在Closed事件中移除对RunWorkerCompleted事件的注册

我们还有另一种方案,那就是在关闭窗体的时候将对RunWorkerCompleted事件的注册接触掉,我们只需要将该操作注册到窗体的FormClosed事件中。

   1: private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
   2: {
   3:     //Do Something
   4: }
   5:  
   6: private void BgwForm_FormClosed(object sender, FormClosedEventArgs e)
   7: {
   8:     this.backgroundWorker.RunWorkerCompleted -= backgroundWorker_RunWorkerCompleted;
   9: }

分类: [02] 编程技巧
作者:Artech
出处:http://artech.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

如果在BackgroundWorker运行过程中关闭窗体…相关推荐

  1. 程序运行过程中更改窗体大小

    报错信息:System.Windows.Forms.Form.Size"的返回值,因为它不是变量 解决方法: 1.(WinForm)FormBorderStyle属性设置为"siz ...

  2. STM32运行过程中降低系统时钟频率

    目录 1. 概述 2. 直接修改外部时钟 2.1 生成时钟函数 2.1.1 设置系统时钟为16M: 2.1.2 配置时钟72M: 2.2 测试降频 3. 借助内部时钟 3.1 生成时钟函数 3.2 测 ...

  3. 操作系统中进程并发运行的过程_三种电磁流量计运行过程中常见故障解决详情!...

    原标题:三种电磁流量计运行过程中常见故障解决详情! 昨天给大家介绍了电磁流量计的一些典型故障,今天我们继续来谈电磁流量计的故障问题!电磁流量计在正常的保养与维护之后,在正常使用的过程中依旧是会因为当时 ...

  4. 程序运行过程中遇到“ORA-03114: not connected to ORACLE”的问题解决

    程序运行过程中遇到"ORA-03114: not connected to ORACLE"的问题解决 参考文章: (1)程序运行过程中遇到"ORA-03114: not ...

  5. python运行过程中会被编译成二进制_Python代码在运行过程中,会被编译成二进制代码。_学小易找答案...

    [单选题]1. ( )是违反设备安全操作规程的错误做法. [单选题]Thank you for your letter ___________ 24th March. (1.0分) [单选题]超外差接 ...

  6. Intel Realsense D435 当摄像头运行过程中突然USB线断开,对RuntimeError: Frame didn't arrived within 5000的异常捕获及处理

    如图,在摄像头运行过程中,摄像头突然断开,可能设备需要对异常进行捕获并处理(如摄像头重连,发出警报,发送信号给车辆让它停止前进等) 需阅读,python异常捕获及处理 191225 通过捕获所有异常, ...

  7. 小程序执行运行过程原理_活性污泥法基本原理、净化反应过程、工艺类型和运行过程中存在的问题...

    ↑ 点击上方"表面活性剂平台"关注我们 活性污泥法实质上是天然水体自净作用的人工强化,能从污水中去除溶解态和胶体态的可生物降解有机物以及能被活性污泥吸附的悬浮固体和其他物质,具有对 ...

  8. java程序中可以如何异常处理?_如何处理罗茨鼓风机在运行过程中出现异常噪音和叶片的运行特性...

    罗茨鼓风机叶片的运行特性: 1.后叶片类型的叶片突出而重要的特点是无过载功率.它消除了对超大电机或其他驱动器的需求.常规叶片的正常工作静态效率范围为65-80%,流线型设计的通常工作静态效率范围为80 ...

  9. Jmeter运行过程中如何让Fiddler同时可以抓获到服务器的应答报文

    在默认情况下,Jmeter运行过程中,Fiddler是抓不到对应的应答报文的. 但是,在某些时候,我们希望分析Jmeter执行失败的原因,想了解Jmeter获取到的应答报文是否有问题,就需要同服务器返 ...

最新文章

  1. [XUPT_ACM]寒假第一次比赛题解
  2. python3数据类型:String字符串
  3. jvm内存参数配置_“步步精心”-常用JVM配置参数
  4. 使用Raphael实现html中绘图
  5. 悄悄地进村,打枪的不要——KyuuBackground(原 ItaBackgroundKyuu)改造完成
  6. Android 应用开发(34)---反编译APK获取代码资源
  7. Incorrect string value:\ \ \ \ \for column'trurname' at row 1
  8. html5 ogv格式转换,Free OGV Video Converter(OGV视频转换器)
  9. 需要视频素材?这个6个网站就够了
  10. 计算机断网后怎么连接网络连接,电脑突然断网, 连接不上网络怎么办? 三种方法轻松找回...
  11. input-group两侧添加额外元素
  12. SAP 领料BAPI BAPI_GOODSMVT_CREATE 提示 短缺未限制使用的SL
  13. Raid磁盘阵列重建后如何恢复原来的数据
  14. java List去除重复数据的五种方式
  15. 活动回顾丨研发效能度量线下沙龙圆满举办
  16. java实现简单扫码登录功能(模仿微信网页版扫码)
  17. 记我的第一个实用bat编写修改历程(windows聚焦壁纸提取)
  18. java 显示另一个窗口_java界面从一个界面跳到另一个界面的时候多出了一个小窗口...
  19. 虚拟机(Please umount the filesystem and rectify the problem(s))记录
  20. 华硕主板氛围灯光设置成关机不亮的解决办法

热门文章

  1. 动真格!因为论文!138名研究生丧失学位申请资格,导师也被罚……
  2. NLP研究索引神器,3000+代码库,一键查找论文、GitHub库
  3. 清华本硕男,月入5W征婚引群嘲“普通却自信”,本人终于回应了!
  4. 我的北大故事:犯其至难图其至远!
  5. Flume原理初探:基本执行原理概述
  6. Linux里新建文件/目录的默认权限
  7. AMNO.6 给出一个不多于5位的整数,要求 1、求出它是几位数 2、分别输出每一位数字 3、按逆序输出各位数字,例如原数为321,应输出123 输入 一个不大于5位的数字
  8. 【OpenCV 4开发详解】边缘检测原理
  9. 链表问题8——将单向链表按某值划分成左边小、中间相等、右边大的形式(初阶)
  10. DXF 最简单的一个文件生成两个直线一条直线放入BLOCKS中通过INSERT插入 (2)