Application.Exit()结束程序,但线程还在的解决方法。
推荐 原创
©著作权归作者所有:来自51CTO博客作者OH51888的原创作品,请联系作者获取转载授权,否则将追究法律责任
以下是我的以下经验,仅供参考而已。
出现此情况大多原因是使用了多线程编程,或者你所调用的dll使用了多线程。
我们知道,一般情况下的线程执行完指定的任务之后是会关闭了的,但是如果对于一些循环类线程,或者忘记关掉的线程时,这个时候就需要我们手动将之强制关闭。用以下三个中的一个即可尝试强制关闭线程。
Application.ExitThread();
//退出当前线程上的消息循环,并关闭该线程上的所有窗口。
System.Environment.Exit(0);
//终止当前进程并为基础操作系统提供指定的退出代码
Process.GetCurrentProcess().Kill();
//终止当前正在运行的线程
但是这些方法都是强制关闭,那么我们如何使用Application.Exit();正常的关闭整个程序呢?这个时候我们要引用下微软对Application.Exit();的解释了
Application.Exit();
// 方法停止在所有线程上运行的所有消息循环,并关闭应用程序的所有窗口
我们看的非常清楚,停止在所有线程上运行的所有消息循环,既然是所有,那又为何关闭不掉呢?
这里我们要搞清楚一点的就是,新开的进程属于另一个domain(域),你要搞清楚的是进程不等于线程,application.exit();是关闭当前进程的所有线程,不能关闭它创建的进程。新进程和本进程无任何关系。所以,我们可以这样理解Application.Exit();
Application.Exit();
// 方法停止在当前进程上的所有线程上运行的所有消息循环,并关闭当前进程上的应用程序的所有窗口。
所以,我们要想在当前进程上使用Application.Exit();关闭其他进程,就要把其他的进程设置为当前进程的后台进程(IsBackground),而当在主线程中创建了一个线程时,那么该线程的IsBackground默认是设置为FALSE的。当主线程退出的时候,IsBackground=FALSE的线程还会继续执行下去,直到线程执行结束。只有IsBackground=TRUE的线程才会随着主线程的退出而退出。
当初始化一个线程,把Thread.IsBackground=true的时候,指示该线程为后台线程。后台线程将会随着主线程的退出而退出。 因此我们在创建完进程之后要在后面加上一句:
IsBackground=true;
然后它才可以被当前进程所控制,然后才可以用Application.Exit();结束。
本文由洗白白丶首发于51cto--.Net论坛,转载请保留此段文字说明。
上一篇:各国黑客技术的现状
下一篇:Mysql中比较时间的方法。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
kubernetes无法删除namespaces命名空间的解决方法
通过etcd删除,亲测可行.[root@k8s-node1 dark]# kubectl get ns |grep TNAME STATUS AGEedison Terminating 6h27mwu
API kubernetes etcd namespaces k8s无法删除命名空间 -
WindowManager$BadTokenException——token null is not for an application解决方法
调用如下代码创建一个对话框时://使用对话框显示用户单击的图片
android开发 android java ide -
word关闭后,后台进程还在的解决方法
word关闭后,后台进程还在的解决方法
解决方法 后台进程 其他 -
强制退出WinForm程序之Application.Exit和Environment.Eixt
这几天在做一个把大量Infopath生成的XML数据,进行处理的程序,我用了MDI子窗体,每个窗体包含了各自的功能,如,遍历目录及其子目录检查文件类型并自动生成Sql语句并入库、对Infopath数据的自动检查、对数据中的某些域的替换及更改处理、对数据文件的合并、拆分、剔除记录、统计数据、 对数据自动导入数据库。。。等等。 当我打开一个子窗体,进行某项操作时,如果字窗体中有循环操作时。如果运行中我...
winform 强制退出 Application.Exit Environment.Eixt 应用程序