丈夫欲遂平生志,一载寒窗一举汤。这篇文章主要讲述Application.Exit()结束程序,但线程还在的解决方法。相关的知识,希望能为你提供帮助。
Unity Application 前后台切换调用关系
正常进:
OnApplicationFocus, isFocus=True
正常退:
OnApplicationQuit
Home出:
OnApplicationPause, isPause=True
OnApplicationFocus, isFocus=False
Home进:
OnApplicationPause, isPause=False
OnApplicationFocus, _isFocus=True
Kill进程:
当前应用双击Home,然后Kill:
OnApplicationQuit
(ios 有回调,android 没回调)
【Application.Exit()结束程序,但线程还在的解决方法。】跳出当前应用,然后Kill:
OnApplicationQuit
(IOS和Android都没回调)
Application.Exit()结束程序,但线程还在的解决方法。出现此情况大多原因是使用了多线程编程,或者你所调用的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论坛,转载请保留此段文字说明。
http://bbs.51cto.com/thread-970057-1.html
推荐阅读
- 安卓GreenDao(基础)
- SpringBoot application.proerties基本配置
- BAT大牛 带你深度剖析Android 10大开源框架
- 关于开发视频直播社交APP小型直播平台搭建问题探讨
- WinXP停止服务怎样办?
- WinXP如何设置IE为默认浏览器?设置默认浏览器的办法
- WinXP浏览器如何删除Cookie?浏览器删除Cookie的办法
- WinXP系统如何关闭默认共享?
- WinXP运用关机命令shutdown的办法