zoukankan      html  css  js  c++  java
  • 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 没回调)

    跳出当前应用,然后Kill:

    OnApplicationQuit  (IOS和Android都没回调)

     

    出现此情况大多原因是使用了多线程编程,或者你所调用的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

  • 相关阅读:
    java Activiti 工作流引擎 SSM 框架模块设计方案
    自定义表单 Flowable 工作流 Springboot vue.js 前后分离 跨域 有代码生成器
    数据库设计的十个最佳实践
    activiti 汉化 stencilset.json 文件内容
    JAVA oa 办公系统模块 设计方案
    java 考试系统 在线学习 视频直播 人脸识别 springboot框架 前后分离 PC和手机端
    集成 nacos注册中心配置使用
    “感恩节 ”怼记
    仓颉编程语言的一点期望
    关于System.out.println()与System.out.print("\n")的区别
  • 原文地址:https://www.cnblogs.com/alps/p/9068312.html
Copyright © 2011-2022 走看看