C# 程序的关闭 讲究解释
程序的关闭是很讲究的,处理的不好的话,将软件连续开启和关闭,当数次后在启动软件后程序会崩溃。或者程序退出很慢。细节决定成败,一款好的软件应该从各方面都要做严格地反复地推敲,力争做到无可挑剔。
有的程序员喜欢在关闭的时候让程序做一些事情,比如保存一些记录什么的,我觉得这样大可不必,因为这些会影响退出的时间,单一职责原则一再强调职责要单一,关闭程序就是关闭程序,不要掺杂其它动作。
当然仅仅一个关闭也有很多种方式的,比如窗体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# 程序的关闭 讲究解释的更多相关文章
- 应用程序的关闭退出(在FMX中,Activity替代了Form的概念)
在VCL中,关闭程序的主窗体也就意味着程序的主循环结束,主程序自然而然结束.所以在主窗体中使用窗体的关闭函数(Close)即可,如下: procedure TfrmMain.btncloseClick ...
- android widget 开发实例 : 桌面便签程序的实现具体解释和源代码 (上)
如有错漏请不吝拍砖指正,转载请注明出处,很感谢 桌面便签软件是android上经常使用软件的一种,比方比較早的Sticky Note,就曾很流行, Sticky Note的介绍能够參见 http:// ...
- 以&运行在后台的程序,关闭terminal后,相应进进程自动关闭
以&运行在后台的程序,关闭terminal后,相应进进程自动关闭
- C# 程序异常关闭时的捕获
本文主要以一个简单的小例子,描述C# Winform程序异常关闭时,如何进行捕获,并记录日志. 概述 有时在界面的事件中,明明有try... catch 进行捕获异常,但是还是会有异常关闭的情况,所以 ...
- windows程序意外关闭子订重启脚本
window程序意外关闭自动重启脚本实现 @echo off :1 tasklist|find /i "xxxx"||start yyyy ping/n 11 127.1> ...
- C# 串口操作系列(2) -- 入门篇,为什么我的串口程序在关闭串口时候会死锁 ?
第一篇文章我相信很多人不看都能做的出来,但是,用过微软SerialPort类的人,都遇到过这个尴尬,关闭串口的时候会让软件死锁.天哪,我可不是武断,算了.不要太绝对了.99.9%的人吧,都遇到过这个问 ...
- gtk+程序在关闭主窗口时的事件流
当鼠标单击gtk+窗口的关闭按钮时,程序首先接收到delete_event,当该事件处理函数返回TRUE表示事件已处理禁止进一步传播,从而取消关闭操作:当返回FALSE时,事件消息进一步向上传播,此时 ...
- 批处理--批量打开程序&批量关闭程序
批量打开程序 start D:\work\RunSvr01\IceFire88.01.exe start D:\work\RunSvr02\IceFire88.02.exe start D:\work ...
- 【LinuxC】GCC编译C程序,关闭随机基址
1.编译.链接和运行程序 C代码示例: #include <stdio.h> #include <stdlib.h> int main() { printf("hel ...
随机推荐
- 查看tensorflow Pb模型所有层的名字
代码如下: import tensorflow as tf def get_all_layernames(): """get all layers name"& ...
- 关于IO的同步,异步,阻塞,非阻塞
上次写了一篇文章:Unix IO 模型学习.恰巧在这次周会的时候,@fp1203 (goldendoc成员之一) 正好在讲解poll和epoll的底层实现.中途正好讨论了网络IO的同步.异步.阻塞.非 ...
- 【洛谷P4430】小猴打架
题目大意:求带标号 N 个点的生成树个数,两棵生成树相同当且仅当两棵树结构相同且边的生成顺序相同. 题解:学会了 prufer 序列. prufer 序列是用来表示带标号的无根树的序列. 每种不同类型 ...
- Unity 截图选择框,中间全透明,边缘半透明
效果:点击白色框可拖拽选择区域 代码: using System.Collections; using System.Collections.Generic; using UnityEngine; u ...
- POI做题笔记
POI2011 Conspiracy (2-SAT) Description \(n\leq 5000\) Solution 发现可拆点然后使用2-SAT做,由于特殊的关系,可以证明每次只能交换两个集 ...
- JDK、JRE、JVM的区别与关系
JDK JDK是Java开发工具包,是Sun Microsystems针对Java开发员的产品. JDK中包含JRE,在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,在这里 ...
- 获取节点 document.getElementBy{Id,Name,TagName,ClassName
document.getElementById(" "); document.getElementByName(" "); document.getElemen ...
- ActiveMQ介绍
一.背景 中间件 由于业务的不同.技术的发展.硬件和软件的选择有所差别,导致了异构组件或应用并存的局面.要使这些异构的组件协同工作,一个有效的方式就是提供一个允许它们进行通信的层,该层即为中间件. 在 ...
- [CTS2019]田野(80分)
loj嘟嘟嘟 学完模拟退火后开始搞这道题,搞了一下午最终搞到了80分,剩下的实在不知道怎么办了-- 首先肯定是把有交点的线段划分到一个集合,然后对每一个集合求一遍凸包. 然后两两合并,如果新的凸包的周 ...
- Linux创建删除文件和文件夹
要想删除和创建,需要有root权限 [xwg@bogon ~]$ su root密码:[root@bogon xwg]# cd /home/a 切换到目录a[root@bogon a]# t ...