程序的关闭是很讲究的,处理的不好的话,将软件连续开启和关闭,当数次后在启动软件后程序会崩溃。或者程序退出很慢。细节决定成败,一款好的软件应该从各方面都要做严格地反复地推敲,力争做到无可挑剔。
    有的程序员喜欢在关闭的时候让程序做一些事情,比如保存一些记录什么的,我觉得这样大可不必,因为这些会影响退出的时间,单一职责原则一再强调职责要单一,关闭程序就是关闭程序,不要掺杂其它动作。
    当然仅仅一个关闭也有很多种方式的,比如窗体Close(),Application.Exit(),Application.ExitThread(),Enviroment.Exit(0),以及Process.GetCurrentProcess().Kill()。这些相信大家在退出时都用到过。这些方法都可以退出程序。在我做的最初的一个项目中,由于刚开始没有全面的设计,很多功能都是大家有了新的想法而加上的,因此里面大量用到了线程,有名字的,没名字的,有的可以管理,有的根本没法获取它并管理它。在退出子窗口的时候,一般使用当前Form.Close(),然后将该窗口内的线程获取到,再一一Abort(),但是在退出主程序的时候,this.Close(),就很慢了,因为很多线程还在运行。所以当时就使用杀死进程的方法。
以上那些退出的方法我都使用过。

2、Application.Exit():这个当有线程时,也要等很久。  

3、Application.ExitThread():出当前线程上的消息循环,并关闭该线程的窗口。  

4、Enviroment.Exit(0):该方法强制退出。  

5、Process.GetCurrentProcess().Kill():当你觉得其它方法退出不太及时或者失灵,那么这个方法就是终极法宝,直接干掉进程,当然也退出了。  

当然了,程序退出时,程序自己要处理很多资源,最安全的方式就是,主窗体Close方法,然后剩下的交给程序做,虽然退出慢,但是这是程序自身的机制去完成的退出绝对安全。可是用户会允许你这么做吗,如果你的软件点击关闭了结果在进程中还生存了很久,或者半天还是放不了资源,那么用户很可能不再使用你的程序。所以本着一切为用户着想的原则,退出还是速度快为好。我常用的方式是。

1、窗体.Close();  

2、Process.GetCurrentProcess().Kill();  

同时使用。

C# 程序的关闭 讲究解释的更多相关文章

  1. 应用程序的关闭退出(在FMX中,Activity替代了Form的概念)

    在VCL中,关闭程序的主窗体也就意味着程序的主循环结束,主程序自然而然结束.所以在主窗体中使用窗体的关闭函数(Close)即可,如下: procedure TfrmMain.btncloseClick ...

  2. android widget 开发实例 : 桌面便签程序的实现具体解释和源代码 (上)

    如有错漏请不吝拍砖指正,转载请注明出处,很感谢 桌面便签软件是android上经常使用软件的一种,比方比較早的Sticky Note,就曾很流行, Sticky Note的介绍能够參见 http:// ...

  3. 以&运行在后台的程序,关闭terminal后,相应进进程自动关闭

    以&运行在后台的程序,关闭terminal后,相应进进程自动关闭

  4. C# 程序异常关闭时的捕获

    本文主要以一个简单的小例子,描述C# Winform程序异常关闭时,如何进行捕获,并记录日志. 概述 有时在界面的事件中,明明有try... catch 进行捕获异常,但是还是会有异常关闭的情况,所以 ...

  5. windows程序意外关闭子订重启脚本

    window程序意外关闭自动重启脚本实现   @echo off :1 tasklist|find /i "xxxx"||start yyyy ping/n 11 127.1> ...

  6. C# 串口操作系列(2) -- 入门篇,为什么我的串口程序在关闭串口时候会死锁 ?

    第一篇文章我相信很多人不看都能做的出来,但是,用过微软SerialPort类的人,都遇到过这个尴尬,关闭串口的时候会让软件死锁.天哪,我可不是武断,算了.不要太绝对了.99.9%的人吧,都遇到过这个问 ...

  7. gtk+程序在关闭主窗口时的事件流

    当鼠标单击gtk+窗口的关闭按钮时,程序首先接收到delete_event,当该事件处理函数返回TRUE表示事件已处理禁止进一步传播,从而取消关闭操作:当返回FALSE时,事件消息进一步向上传播,此时 ...

  8. 批处理--批量打开程序&批量关闭程序

    批量打开程序 start D:\work\RunSvr01\IceFire88.01.exe start D:\work\RunSvr02\IceFire88.02.exe start D:\work ...

  9. 【LinuxC】GCC编译C程序,关闭随机基址

    1.编译.链接和运行程序 C代码示例: #include <stdio.h> #include <stdlib.h> int main() { printf("hel ...

随机推荐

  1. web开发:css基础

    一.w3c架构分析 二.css三种引入 三.三种引入的优先级 四.基础选择器 五.长度单位与颜色 六.文件样式操作 七.display 一.w3c架构分析 <!DOCTYPE html> ...

  2. H2数据库启动提示8082端口被占用

    The Web Console server could not be started. Possible cause: another server is already running at ht ...

  3. 【完美解决】vue,页面跳转样式错位但是刷新又好了的情况

    在vue文件中,做样式分离: 将覆盖样式单独写在一个style标签内,原页面写在 scoped样式作用域下.

  4. python再学习笔记

    python各种半桶水QAQ,一些特性经常跟其他语言搞混,官方入门文档重读温习...... 最好用4个空格的缩进空值是Python里一个特殊的值,用None表示变量就是在程序中用来指向这些数据对象的, ...

  5. Python求均值,方差,标准差

    import numpy as nparr = [1,2,3,4,5,6]#求均值arr_mean = np.mean(arr)#求方差arr_var = np.var(arr)#求标准差arr_st ...

  6. Persistent Bookcase CodeForces - 707D (dfs 离线处理有根树模型的问题&&Bitset)

    Persistent Bookcase CodeForces - 707D time limit per test 2 seconds memory limit per test 512 megaby ...

  7. axios 用 params/data 发送参数给 springboot controller,如何才能正确获取

    今天有人遇到接口调用不通的情况,粗略看了一下是axios跨域请求引起了.找到问题,处理就简单多了. 但是我看其代码,发现比较有意思 export function agentlist(query) { ...

  8. [转载]springboot--常用注解--@configration、@Bean

    springboot--常用注解--@configration.@Bean @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME ...

  9. integer == 号问题

    integer a=123 integer b=123 integer c=250 integer d=250 a==b(true) c==d (false) Integer中把-128-127 缓存 ...

  10. SpringDatajpa 使用原生的SQL进行分组查询

    话不多说,直接上代码 dao nativeQuery = true ---> 执行原生的SQL语法,也就是说这段sql拷贝到数据库中,然后就运行. 我们期望的结果: 取值: 取值结果: 结合实际 ...