一个支持Abort的BackgroundWorker
.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相关推荐
- mysql model first,一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具
一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具 Intro DbTool 是一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具,原本 ...
- 如何基于Restful ABAP Programming模型开发并部署一个支持增删改查的Fiori应用
Jerry之前的文章30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用 发布之后,有朋友问我,"没错, 我是在你的文章里看到了Fiori应用的 ...
- 30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用
2016年时,Jerry曾经写过一系列关于SAP Fiori Smart Template(现在更名为Fiori Elements了)的博客,介绍了所谓的MDD开发方法论 - Metadata Dri ...
- 一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具
一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具 Intro DbTool 是一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具,原本 ...
- LeetCode 1381. 设计一个支持增量操作的栈(deque/数组)
1. 题目 请你设计一个支持下述操作的栈. 实现自定义栈类 CustomStack : CustomStack(int maxSize):用 maxSize 初始化对象,maxSize 是栈中最多能容 ...
- 1381. 设计一个支持增量操作的栈
2020-05-11 1.题目描述 设计一个支持增量操作的栈 2.题解 使用vector在进行增量操作的时候会方便一些,vector支持push_back.pop_back.empty操作. 3.代码 ...
- java maven restful_使用 maven 生成一个支持端到端自动测试的 RESTful 服务项目脚手架...
额外的话: 我会非常感激如果您在读本文的时候 Follow 文中的操作步骤在你的环境中实践本文所讲内容, 我保证这个过程不会非常复杂, 即便加上你研究代码的时间也不需要超过 15 分钟 和传统后端页面 ...
- 仿照微信的效果,实现了一个支持多选、选原图和视频的图片选择器
代码地址如下: http://www.demodashi.com/demo/11689.html 重要提示: 1. 1.9.0版本已发布,移除了"prefs:root="的调用,这 ...
- LeetCode 5357. 设计一个支持增量操作的栈
5357. 设计一个支持增量操作的栈 思路:用数组实现即可 class CustomStack { public:CustomStack(int maxSize) {fill(a,a+1001,-1) ...
最新文章
- P1569 [USACO11FEB]属牛的抗议Generic Cow Prote…
- 学习python装饰器_Python装饰器学习(九步入门)
- Spring3 MVC Login Interceptor(Spring 拦截器)
- Effective Java之覆盖equal时要遵守通用约定(八)
- regular expression in SAP jam integration
- GraalVM上的Picocli:极快的命令行应用程序
- 【linux】IP最大可传65535而以太网最大只能传1500问题解析
- 深度学习2.0-40.LSTM原理及实战
- 【博客管理】博客新建栏目的添加—HTML格式书写规范
- 重装驱动:Failed to initialize NVML: Driver/library version mismatch
- android 替代map,Android为什么推荐使用SparseArray来替代HashMap?
- word-break: break-all与word-wrap:break-word的区别
- keil4注册机注册不了怎么办?我已经试过下面的注册机不行。求各大神指教一下?
- 升级JUnit5及其特性介绍
- 多元逻辑回归 · 数学推导过程及代码实现完全解析
- 计算机对环境保护的应用,计算机技术在环境保护中的应用
- android+色调+半透明,91桌面Android3.0绽放 智能美化双管齐下
- 2018蓝桥杯 航班时间和乘积尾零
- linux 删除乱码文件名的文件
- IDEA新版UI申请方法+无测试资格使用方法及相关介绍
热门文章
- SQL server 2012 如何取上个月的最后一天
- 让所有中国人看了气氛的广东某学校捐款过程
- ubuntu18.04安装nextcloud以及相关配置
- S6 文件备份与压缩命令
- 10.17 linux 文件权限
- modelandview 可以返回html么_Python: 爬虫网页解析工具lxml.html(一)
- c语言int val,c语言不定参数与printf函数的实现
- python哪些模块用于数据分析_python数据解析模块之glom模块的使用(一)
- 未来,让我们一起想象 — “Imagine” 阿里云视频云全景创新峰会
- 从MVC到云原生:CBU研发体系演进之路