.net平台提供的BackgroundWorker不支持强制终止操作,所以这边实现了一个支持Abort操作的BackgroundWorker.

  1 using System;
  2 using System.Threading;
  3 using System.ComponentModel;
  4 using System.Windows.Forms;
  5 namespace AbortableWorker
  6 {
  7     /// <summary>
  8     /// backgroundworker
  9     /// </summary>
 10     class tbBackgroundWorker
 11     {
 12         private Thread mThread=null;
 13         private bool mIsBusy = false;
 14         private AsyncOperation mAsyncOperation = null;
 15         private DoWorkEventArgs mArgs = null;
 16
 17         public event DoWorkEventHandler DoWork;
 18         public event RunWorkerCompletedEventHandler RunWorkerCompleted;
 19         public event ProgressChangedEventHandler ProgressChanged;
 20
 21        /// <summary>
 22        ///  开始异步运行线程,请在界面线程中调用
 23        /// </summary>
 24         public void RunWorkerAsync()
 25         {
 26             RunWorkerAsync(null);
 27         }
 28
 29         /// <summary>
 30         ///  开始异步运行线程,请在界面线程中调用
 31         /// <param name="args">线程运行的参数,作为DoWork里面的args成员</param>
 32         /// </summary>
 33         public void RunWorkerAsync(object args)
 34         {
 35             mAsyncOperation = AsyncOperationManager.CreateOperation(null);
 36             mThread = new Thread(new ParameterizedThreadStart(RunDowork));
 37             mThread.IsBackground=true;
 38             mThread.Start(args);
 39         }
 40
 41         /// <summary>
 42         /// 发送取消请求
 43         /// </summary>
 44         public void CancelAsync()
 45         {
 46             this.mArgs.Cancel = true;
 47         }
 48
 49         /// <summary>
 50         /// 终止后台进程,不会触发Complete事件,后台进程直接结束
 51         /// </summary>
 52         public void Abort()
 53         {
 54             System.Diagnostics.Debug.WriteLine(mThread.ThreadState.ToString());
 55             if (this.mThread != null && (mThread.IsAlive))
 56             {
 57                 try
 58                 {
 59                     this.mThread.Abort();
 60
 61                 }
 62                 catch (Exception e)
 63                 {
 64
 65                 }
 66
 67                 this.mIsBusy = false;
 68             }
 69         }
 70
 71         /// <summary>
 72         /// 指示后天线程是否还在运行
 73         /// </summary>
 74         public bool IsBusy
 75         {
 76             get
 77             {
 78                 return this.mIsBusy;
 79             }
 80         }
 81
 82         /// <summary>
 83         /// 汇报进度,触发ProgressChanged事件
 84         /// </summary>
 85          public void ReportProgress(int precent)
 86         {
 87             ReportProgress(precent, null);
 88         }
 89
 90         /// <summary>
 91         /// 汇报进度,触发ProgressChanged事件
 92         /// </summary>
 93          public void ReportProgress(int precent,object userstate)
 94         {
 95             ProgressChangedEventArgs args = new ProgressChangedEventArgs(precent, userstate);
 96             mAsyncOperation.Post(RunReportProgress, args);
 97         }
 98
 99         /// <summary>
100         /// 实际线程函数
101         /// </summary>
102         /// <param name="args"></param>
103         private void RunDowork(object args)
104         {
105             Exception exception=null;
106             DoWorkEventArgs dowork=new DoWorkEventArgs(args);
107             mArgs = dowork;
108             mIsBusy = true;
109             try
110             {
111                 DoWork(this, dowork);
112             }
113             catch(Exception e)
114             {
115                 exception=e;
116             }
117             RunWorkerCompletedEventArgs completeArgs = new RunWorkerCompletedEventArgs(dowork.Result, exception, dowork.Cancel);
118             mIsBusy = false;
119             mAsyncOperation.Post(RunReportFinish, completeArgs);
120         }
121
122         private void RunReportProgress(object args)
123         {
124             ProgressChangedEventArgs progressargs=(ProgressChangedEventArgs)args;
125             if (ProgressChanged != null)
126             {
127                 ProgressChanged(this, progressargs);
128             }
129
130         }
131
132         private void RunReportFinish(object args)
133         {
134             RunWorkerCompletedEventArgs completeArgs = (RunWorkerCompletedEventArgs)args;
135             if (RunWorkerCompleted != null)
136             {
137                 RunWorkerCompleted(this, completeArgs);
138             }
139         }
140
141     }
142 }

转载于:https://www.cnblogs.com/ngxianyu/p/3359088.html

一个支持Abort的BackgroundWorker相关推荐

  1. mysql model first,一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具

    一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具 Intro DbTool 是一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具,原本 ...

  2. 如何基于Restful ABAP Programming模型开发并部署一个支持增删改查的Fiori应用

    Jerry之前的文章30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用 发布之后,有朋友问我,"没错, 我是在你的文章里看到了Fiori应用的 ...

  3. 30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用

    2016年时,Jerry曾经写过一系列关于SAP Fiori Smart Template(现在更名为Fiori Elements了)的博客,介绍了所谓的MDD开发方法论 - Metadata Dri ...

  4. 一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具

    一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具 Intro DbTool 是一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具,原本 ...

  5. LeetCode 1381. 设计一个支持增量操作的栈(deque/数组)

    1. 题目 请你设计一个支持下述操作的栈. 实现自定义栈类 CustomStack : CustomStack(int maxSize):用 maxSize 初始化对象,maxSize 是栈中最多能容 ...

  6. 1381. 设计一个支持增量操作的栈

    2020-05-11 1.题目描述 设计一个支持增量操作的栈 2.题解 使用vector在进行增量操作的时候会方便一些,vector支持push_back.pop_back.empty操作. 3.代码 ...

  7. java maven restful_使用 maven 生成一个支持端到端自动测试的 RESTful 服务项目脚手架...

    额外的话: 我会非常感激如果您在读本文的时候 Follow 文中的操作步骤在你的环境中实践本文所讲内容, 我保证这个过程不会非常复杂, 即便加上你研究代码的时间也不需要超过 15 分钟 和传统后端页面 ...

  8. 仿照微信的效果,实现了一个支持多选、选原图和视频的图片选择器

    代码地址如下: http://www.demodashi.com/demo/11689.html 重要提示: 1. 1.9.0版本已发布,移除了"prefs:root="的调用,这 ...

  9. LeetCode 5357. 设计一个支持增量操作的栈

    5357. 设计一个支持增量操作的栈 思路:用数组实现即可 class CustomStack { public:CustomStack(int maxSize) {fill(a,a+1001,-1) ...

最新文章

  1. P1569 [USACO11FEB]属牛的抗议Generic Cow Prote…
  2. 学习python装饰器_Python装饰器学习(九步入门)
  3. Spring3 MVC Login Interceptor(Spring 拦截器)
  4. Effective Java之覆盖equal时要遵守通用约定(八)
  5. regular expression in SAP jam integration
  6. GraalVM上的Picocli:极快的命令行应用程序
  7. 【linux】IP最大可传65535而以太网最大只能传1500问题解析
  8. 深度学习2.0-40.LSTM原理及实战
  9. 【博客管理】博客新建栏目的添加—HTML格式书写规范
  10. 重装驱动:Failed to initialize NVML: Driver/library version mismatch
  11. android 替代map,Android为什么推荐使用SparseArray来替代HashMap?
  12. word-break: break-all与word-wrap:break-word的区别
  13. keil4注册机注册不了怎么办?我已经试过下面的注册机不行。求各大神指教一下?
  14. 升级JUnit5及其特性介绍
  15. 多元逻辑回归 · 数学推导过程及代码实现完全解析
  16. 计算机对环境保护的应用,计算机技术在环境保护中的应用
  17. android+色调+半透明,91桌面Android3.0绽放 智能美化双管齐下
  18. 2018蓝桥杯 航班时间和乘积尾零
  19. linux 删除乱码文件名的文件
  20. IDEA新版UI申请方法+无测试资格使用方法及相关介绍

热门文章

  1. SQL server 2012 如何取上个月的最后一天
  2. 让所有中国人看了气氛的广东某学校捐款过程
  3. ubuntu18.04安装nextcloud以及相关配置
  4. S6 文件备份与压缩命令
  5. 10.17 linux 文件权限
  6. modelandview 可以返回html么_Python: 爬虫网页解析工具lxml.html(一)
  7. c语言int val,c语言不定参数与printf函数的实现
  8. python哪些模块用于数据分析_python数据解析模块之glom模块的使用(一)
  9. 未来,让我们一起想象 — “Imagine” 阿里云视频云全景创新峰会
  10. 从MVC到云原生:CBU研发体系演进之路