当前位置: 首页 > news >正文

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

在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: }

image 当该窗体被显示出来后,点击按钮让注册到该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: }


转载 作者:Artech http://www.cnblogs.com/artech/archive/2010/11/25/backgroundWorker.html

相关文章:

  • [TestLink]testlink安装
  • 【Android】使用AsyncTask来处理一些简单的需要后台处理的动作
  • 如何让你的网页加载时间降低到 1s 内
  • 洛谷 [P1118] IOI1994 数字三角形
  • C#中 一次执行多条带GO的sql语句
  • 贪吃蛇-需求分析
  • C#正则表达式(RegEx)高级应用之分组(Group)替换(Replace)
  • algorithm.sty not found error in LaTeX 解决方法
  • C# regex replace
  • linux 的 awk 使用
  • Linux启动检测磁盘失败
  • 简历已经过时了,而这里正是你需要的
  • 虚拟机RAC的ASM磁盘组坏块导致重建DB
  • ASP.NET 5 入门 (2) – 自定义配置
  • hadoop进阶
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 【Linux系统编程】快速查找errno错误码信息
  • Angular2开发踩坑系列-生产环境编译
  • DataBase in Android
  • isset在php5.6-和php7.0+的一些差异
  • JS数组方法汇总
  • LeetCode29.两数相除 JavaScript
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 分享一份非常强势的Android面试题
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 排序算法之--选择排序
  • 算法---两个栈实现一个队列
  • 项目管理碎碎念系列之一:干系人管理
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 在Unity中实现一个简单的消息管理器
  • Spring Batch JSON 支持
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 进程与线程(三)——进程/线程间通信
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • #stm32整理(一)flash读写
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • #图像处理
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (SpringBoot)第七章:SpringBoot日志文件
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (七)Knockout 创建自定义绑定
  • (一一四)第九章编程练习
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)jQuery 基础
  • (转载)利用webkit抓取动态网页和链接
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .net framework profiles /.net framework 配置
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET企业级应用架构设计系列之开场白
  • .ui文件相关
  • @ConditionalOnProperty注解使用说明