BackGroundWorker 中途取消,关闭后台线程的问题

问题描述

现在有个界面,我点击一个按钮,启动后台线程_backgroundWorker,在_backgroundWorker_DoWork里面我调用一个其他类的方法A(),在A里面有个循环查找,时间很长,现在问题就是我在后台线程开启之后,中途关闭这个窗体,在关闭事件里面这么写的if(_backgroundWorker.IsBusy){_backgroundWorker.CancelAsync();//取消掉Completed事件,不进行接收_backgroundWorker.RunWorkerCompleted-=newRunWorkerCompletedEventHandler(_backgroundWorker_RunWorkerCompleted);}原因是不知道怎么结束掉这个进程,只能在接收上做处理了,因为处理结果和提示都在Completed里面,这样做也可以达到我要的效果,但是后台线程没有结束,有点小担忧,所有求个方法结束掉这个后台进程。在网上找了下,都是只能在_backgroundWorker_DoWork这个事件里面循环才能用e.Cancel结束,我能想到的就是用一个全局变量控制,窗体关闭时给全局变量赋值,然后在循环里面判断,有别的方法么

解决方案

解决方案二:
_backgroundWorker.CancelAsync();只是一个状态判断,不会终止线程的你在A()方法里面要做if(e.Cancel){return;}跳出这个方法才会让线程停掉线程只有这方法停止其他的
解决方案三:
引用1楼wyd1520的回复:

_backgroundWorker.CancelAsync();只是一个状态判断,不会终止线程的你在A()方法里面要做if(e.Cancel){return;}跳出这个方法才会让线程停掉线程只有这方法停止其他的

我知道要在DoWork里面判断e.Cancel可是循环在其他类里面,根本就取不到这个e,void_backgroundWorker_DoWork(objectsender,DoWorkEventArgse){A();}已经进入到A方法了,在A里面循环,我要做的就是在循环里面做是否中断的判断,但是这个e.Cancel在A里面取不到
解决方案四:
最优雅的方案当然是实现协作取消(主动判断状态,停止循环),然而就像LZ的状况,执行自己不能控制的长时间任务的话,想取消那就只能自己创建并控制线程,需要的时候Abort了。不过这种暴力手段有一定危险性,需要执行的代码中能够适应突然冒出来的ThreadAbortException,可能导致状态损坏和资源泄露。一般如果是自己的代码,最好还是想办法实现协作取消(让执行的任务接受一个取消标识来进行判断)。如果是第三方代码,稳妥一点的方式是使用应用程序域隔离,这个可以通过卸载/重建AppDomain来防止托管状态损坏的可能,然而还是有可能产生非托管资源泄露。最终手段是进程隔离。
解决方案五:
用个全局bool变量判断吧.
解决方案六:
引用2楼powerat123的回复:

我知道要在DoWork里面判断e.Cancel可是循环在其他类里面,根本就取不到这个e,void_backgroundWorker_DoWork(objectsender,DoWorkEventArgse){A();}已经进入到A方法了,在A里面循环,我要做的就是在循环里面做是否中断的判断,但是这个e.Cancel在A里面取不到

当参数传进去啊
解决方案七:
引用5楼shingoscar的回复:

Quote: 引用2楼powerat123的回复:
我知道要在DoWork里面判断e.Cancel可是循环在其他类里面,根本就取不到这个e,void_backgroundWorker_DoWork(objectsender,DoWorkEventArgse){A();}已经进入到A方法了,在A里面循环,我要做的就是在循环里面做是否中断的判断,但是这个e.Cancel在A里面取不到

当参数传进去啊

我试了,因为A()方法只会调用一次,即使当参数把e传过去,那也只是当时的初始值,当界面关闭后,这个e.Cancel改变后,不会影响到已经运行中的A方法,看来只能用全局参数来控制了,强制结束线程么。这是要报错的节奏。。。
解决方案八:
你可以在函数A里判断backgroundWorker1.CancellationPending这本身就已经算是个全局变量了,跟e无关的只要你执行了CancelAsync(),它就会变成true
解决方案九:
A(DoWorkEventArgse)

时间: 2024-12-21 18:47:33

BackGroundWorker 中途取消,关闭后台线程的问题的相关文章

Macbook怎么关闭后台程序?

  有时候我们的Macbook电脑运行某个程序卡在那里耗了很长时间,程序本身有可能提供了取消按钮,点了也没有反应,这时候我们就很想强制关闭它了,那么Macbook怎么强制关闭后台运行的程序呢?下面小编就给大家带来几种关于Macbook怎么关闭后台程序的方法. 1.方法1: 我觉得最好得办法,按下快捷键:Command+Option+Esc来打开"强制退出应用程序"的窗口,然后选中你需要退出的程序,再点右下方的"强制退出"即可. 2.方法2: 如果你非常确定你正处于当

Spring MVC Web站点的后台线程

问题描述 项目需要通过串口实时采集数据,存入缓存和数据库,然后将缓存中数据显示给用户.串口的数据采集是被动的,需要实时监听.所以站点启动后就需要启动一个用户线程来采集数据.今天试了继承DispatcherServlet类,在initFrameServlet函数中实现后台线程的启动,在destroy函数中实现线程的关闭.在服务器启动时用户线程能正常启动,并能使用spring注入bean,但当shutdown.bat服务器的时候,用户线程并不退出,还一直执行.日志中也没有执行destroy函数的信息

【源码共享 】- 多线程版仿PS的缩放模糊(ZoomBlur),支持进度显示、中途取消、适时更新等。

问题描述 之前一直在用VB6进行图像处理算法学习,最近转C#,对C#的效率感到很满意.过年这段日子在家里没事琢磨着多线程和图像的结合,由于从没有进行过多线程编程,在一些前人的指导下,马马虎虎的拼凑了一些想法,终于搞定了一个简单的多线程效果,现共享给大家,主要目的在于抛砖引玉,还烦请这方面的高手能给我们做个真正完美的图像出算法上的多线程实例.我用的实例是缩放模糊(ZoomBlur),因为这个算法比较耗时,所以对于大图来说不用多线程,会使主界面的UI操作失去响应.关于这个算法的原始代码在网络上有.P

后台线程如何调用主线程的函数呢

问题描述 主窗口主线程//自已写了一个RichTextBox的函数.这样操作就方便多了.后台线程想调用,把后台的信息直接更新到主窗口上.publicvoidAppNotice(stringmsg,Colorcolor,intI,boolbold){lock(Notice){//Notice.SelectionColor=Color.FromArgb(133,183,12);这是RGB设置this.NoticerichTextBox.AppendText(msg);intStartI=(Notic

C#.Net前台线程与后台线程的区别

.Net的公用语言运行时(Common Language Runtime,CLR)能区分两种不同类型的线程:前台线程和后台线程.这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出:而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束. .Net环境使用Thread建立的线程默认情况下是前台线程,即线程属性IsBackground=false,在进程中,只要有一个前台线程未退出,进程就不会终止.主线程就是一个前台线程. 而后台线程不

分享JavaScript获取网页关闭与取消关闭的事件

 这篇文章主要介绍了JavaScript获取网页关闭与取消关闭的事件,有需要的朋友可以参考一下 在做Web开发时,我们经常用到页面关闭事件onbeforeunload,可以给用户一个选择放弃关闭的机会,就比如这个博客编辑器.如果用户选择了离开,那么onunload事件自然会触发:但若用户选择了取消,又该如何检测呢?   我们假定一个页面离开取消事件,叫做onunloadcancel.显然,这个事件应触发在用户按下对话框的取消按钮之后.但关闭提示对话框的触发流程并不是那么简单.我们先来回顾下这个过

win8.1系统怎么关闭后台程序

    win8.1系统怎么关闭后台程序 方法一:鼠标右键关闭 1.在Win8中使用过应用程序后,返回传统桌面,把鼠标移动到屏幕的最左上角,此时会出现在后台运行的应用程序; 2.点击鼠标右键,选择"关闭"即可. 方法二:使用任务管理器关闭 1.在任务管理器中找到那个应用程序,在上面点击鼠标右键,选择"结束任务"; 2.也可以点击"详细信息",查看该应用程序占用计算机Cpu.内存等等资源的情况,也可以在此页面右键选择"结束任务"

Win8系统无法关闭后台程序导致电脑卡的解决方法

  Win8系统无法关闭后台程序导致电脑卡的解决方法.在雨林木风win8系统中运行的应用程序,往往无法关闭,因为没有关闭的选项,这些应用程序一直在后台运行,导致电脑变卡,严重影响操作.那么Win8系统无法关闭后台程序怎么办呢?大家不要着急,针对此问题,小编研究整理出win8系统关闭后台程序的方法,大家不妨一起来学习下. 解决方法一: 1.在Win8中使用过应用程序后,返回传统桌面,把鼠标移动到屏幕的最左上角,此时会出现在后台运行的应用程序; 2.点击鼠标右键,选择"关闭"即可. 解决方

Win8系统如何关闭后台程序?

  Win8系统使用越来越广泛的今日,不少用户在安装了Win8系统之后都普遍表示对Win8系统非常的不熟悉,很经常因为自己无意中打开了太多的程序而导致了电脑卡顿,而且要彻底关闭后台程序的方法又不熟悉,所以今天小编特地总结了Win8系统如何关闭后台程序的方法,希望对大家有所帮助. 步骤一:在Win8系统的桌面,在Win8系统桌面底部的任务栏出点击鼠标右键,打开菜单后选择"任务管理器"; 步骤二:在Win8的"任务管理器"中,选择"进程"的选项卡,然