.NET(C#):谈谈各种结束进程的方法加菲猫21

.NET程序员不需要懂的(为了对得起这标题,把它们加进来……)

Process.CloseMainWindow是GUI程序的最友好结束方式,从名字上就可以看出来它是通过关闭程序主窗体,相当于用户点击窗体的关闭按钮或者按Alt+F4。它的本质就是向主窗体发送WM_CLOSE消息(Process.MainWindowsHandle可以返回主窗体的句柄)。这个可以在.NETFramework源代码中看出来:

publicboolCloseMainWindow()

{

IntPtrmainWindowHandle=this.MainWindowHandle;

//句柄是否为0

if(mainWindowHandle==IntPtr.Zero)

returnfalse;

}

//GetWindowLong是否成功执行

if((NativeMethods.GetWindowLong(newHandleRef(this,mainWindowHandle),-16)&0x8000000)!=0)

//0x10是WM_CLOSE消息

//向主窗体发送WM_CLOSE,注意是PostMessage而不是SendMessage

NativeMethods.PostMessage(newHandleRef(this,mainWindowHandle),0x10,IntPtr.Zero,IntPtr.Zero);

returntrue;

CloseMainWindow方法使用PostMessage(不是SendMessage,所以消息会加在消息队列的最后)方法向主窗体发送一个WM_CLOSE消息,这样等主窗体处理完所有消息后,等遇到WM_CLOSE便开始执行退出动作。

比如记事本接到了WM_CLOSE消息但是有未保存的文件,记事本会弹出对话框提示用户保存还是不保存还是取消退出操作。WindowsForms和WPF的窗体都会有类似操作,通过窗体的Closing事件来在WM_CLOSE消息接收后做出是否退出的决定。

之后我们会讲到WindowsForms和WPF都有自己的友好型常规退出方式,但是其实有一个通用的GUI程序退出方式,就是利用这个CloseMainWindow方法:

//WindowsForms和WPF都可以用

//WindowsForms的Form.Closing事件会在之后发生

//WPF的Windows.Closing事件也会

Process.GetCurrentProcess().CloseMainWindow();

接下来就是Process.Kill方法,从名字也可以看出来,直接杀掉,不给任何喘息机会呵呵。Kill方法会直接结束整个进程,不进行常规资源清理(什么finally块等……)。Kill本质调用本地API:TerminateProcess函数。

最后一个是Process.Close方法。抱歉它根本不是用来结束进程的!这个方法名字有些误导,其实则不然。它仅仅是IDisposable的Dispose方法的具体执行,用来进行Process类的托管资源清理的!

由于Process类继承自Component类,后者继承IDisposable而同时又有析构函数,而通过一个继承类可改写的Dispose方法(参数是booldisposing)来判断这个Dispose是用户调用还是GC调用。而这个Process.Close()方法正是用户调用Dispose时进行托管资源的清理方法:

下面Process.Dispose方法代码:

protectedoverridevoidDispose(booldisposing)

if(!this.disposed)

if(disposing)

//用户调用,清理托管资源

this.Close();

this.disposed=true;

//调用Component的Dispose

base.Dispose(disposing);

可见这个Close方法类似很多其他.NET中的类的Close,比如Stream……因此Close肯定不会结束进程,仅仅是Process类作为IDisposable接口的间接继承者的自我清理方法。

Environment.Exit相当于在Main函数中的return指令。不过它不会执行代码块的finally块(如果有的话),但资源清理还是要进行的。

它是最常见的退出当前进程的方法之一。在Main函数中我们可以直接return语句便退出了程序。如果不在Main函数内,那么Environment.Exit方法就可以派上用场:

classa

~a()

Console.WriteLine("析构函数");

classProgram

staticvoidMain()

try

aoa=newa();

test();

finally

//这段代码永远不会执行

Console.WriteLine("finally");

staticvoidtest()

Environment.Exit(0);

代码将会输出:

析构函数

看来GC调用了oa的析构函数,但注意finally块没有运行。

Environment.FailFast方法更速度,它甚至不需要向操作系统返回进程退出代码(ExitCode),直接结束当前进程并在应用程序事件薄中写入信息,用于程序出现致命错误需要立即停止。

Environment.FailFast("致命错误发生!");

在.NET4.0下,Environment.FailFast代码会抛出FatalExecutionEngineError,而在4.0之前会抛出ExecutionEngineException。但都不会有任何输出(GC没有清理对象,同时finally块也没有运行)

GUI程序往往都有自己的消息队列和事件管理模式,因此结束一个GUI程序要远复杂与结束一个控制台程序。上述的方法中,Process.Kill和Environment.Exit和FailFast如果用在一个GUI程序中,都会直接强制结束整个程序,而不会激发GUI窗体的一些针对应用程序结束的事件(比如Closing事件)。而上面也讲过:Process.CloseMainWindow通过向主窗体发送一个WM_CLOSE消息可以很好的结束一个GUI程序,不过往往更自然的方法是利用GUI框架本身提供的结束程序的方法。

WPF中是System.Windows.Application.Shutdown方法,它其实就是在当前线程的消息队列Dispatcher对象中加入一个正常优先级(DispatcherPriority.Normal)的回调退出函数,等消息队列最后处理到该项时程序开始退出操作。通常这样使用:

//或者App也可以,WPF程序默认会有一个App类继承Application类

Application.Current.Shutdown();

WindowsForms中是:System.Windows.Forms.Application.Exit方法。它是通过Application.OpenFormsInternal属性先把已经打开的窗体通过正常方式都关闭(运行Form.Closing事件),最后再结束整个应用程序进程。

最后,通过WPF的Window.Closing或WindowsForms的Form.Closing事件都可以取消这种形式的退出操作。

这是WindowsAPI中结束进程的非托管方法。ExitProcess结束进程更友好些,而TerminateProcess会立即强制结束进程。两者的关系有点像Environment.Exit和FailFast,但我不确定本质上是否一样。而且TerminateProcess可以指定进程返回值,但FailFast不可以。两个非托管API的执行都不回运行finally块。

usingSystem.Runtime.InteropServices;

[DllImport("kernel32.dll")]

staticexternvoidExitProcess(uintuExitCode);

[DllImport("kernel32.dll",SetLastError=true)]

[return:MarshalAs(UnmanagedType.Bool)]

staticexternboolTerminateProcess(IntPtrhProcess,uintuExitCode);

ExitProcess(1);

//或者

TerminateProcess(Process.GetCurrentProcess().Handle,1);

在一个GUI程序运行环境下,我们通过得到窗体的句柄,然后便可以向该句柄发送消息,WndProc(WindowProcedure)函数会处理相应的事件。其中WM_CLOSE相当于用户点击关闭按钮,使用PostMessage将WM_CLOSE发送至主窗体等价于.NET中Process类的CloseMainWindow方法,当接收到WM_CLOSE消息时,应用程序是可以选择是否真正结束程序的,如果继续结束程序而不取消。接着WM_DESTROY消息会发送,这个消息代表着窗体开始真正关闭,此时可以进行一些资源的清理。最后当前线程接收到WM_QUIT消息,线程的消息循环会被终止。

因此向窗体发送这3个消息,只有WM_CLOSE会引发Closing事件,属于正常窗体退出逻辑,其他两个中消息会直接强行关闭窗体。

注意WM_QUIT消息只能用PostMessage将其送至消息队列尾部,使用SendMessage立即发送在WPF应用程序上运行后程序没有任何反应。

下面是一个WPF程序发送下列消息,(并没有贴XAML,你一定知道怎样加3个按钮然后把Click事件和窗体的Closing事件绑在代码上吧)

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Windows;

usingSystem.Windows.Controls;

usingSystem.Windows.Data;

usingSystem.Windows.Documents;

usingSystem.Windows.Input;

usingSystem.Windows.Media;

usingSystem.Windows.Media.Imaging;

usingSystem.Windows.Navigation;

usingSystem.Windows.Shapes;

//外加命名空间

usingSystem.Diagnostics;

namespaceMgen.TEX

publicpartialclassMainWindow:Window

publicMainWindow()

InitializeComponent();

//Windows消息值

constuintWM_CLOSE=0x10;

constuintWM_DESTROY=0x02;

constuintWM_QUIT=0x12;

//SendMessage和PostMessage的P/Invoke

[DllImport("user32.dll",CharSet=CharSet.Auto)]

staticexternIntPtrSendMessage(IntPtrhWnd,uintMsg,IntPtrwParam,IntPtrlParam);

[DllImport("user32.dll",SetLastError=true)]

staticexternboolPostMessage(IntPtrhWnd,uintMsg,IntPtrwParam,IntPtrlParam);

//窗体的Closing事件,判断Closing是否被运行

privatevoidWindow_Closing(objectsender,System.ComponentModel.CancelEventArgse)

MessageBox.Show("Closing事件!");

//发送三种消息

privatevoidWM_CLOSE_Click(objectsender,RoutedEventArgse)

//也可以用PostMessage

SendMessage(Process.GetCurrentProcess().MainWindowHandle,WM_CLOSE,IntPtr.Zero,IntPtr.Zero);

privatevoidWM_DESTROY_Click(objectsender,RoutedEventArgse)

SendMessage(Process.GetCurrentProcess().MainWindowHandle,WM_DESTROY,IntPtr.Zero,IntPtr.Zero);

privatevoidWM_QUIT_Click(objectsender,RoutedEventArgse)

//只能使用PostMessage去将WM_QUIT送至消息队列尾部

PostMessage(Process.GetCurrentProcess().MainWindowHandle,WM_QUIT,IntPtr.Zero,IntPtr.Zero);

THE END
1.@四川宠主:过年赚七天加班费不够寄养“毛孩子”你焦虑了吗?中国...上门喂养:省心的同时最省钱,比寄养费用低一 随着宠物产业的不断发展,除了寄养,还有少量的宠物店和宠物医院提供上门服务。在走访成都市青羊区贝森路周围的5家宠物店和宠物医院后,有1家是可以提供上门喂猫服务的: 负责人介绍说,每次上门服务的价格为88元,在宠主离家之前预约,工作人员会上门排查宠主家里的环境对猫咪...http://sc.china.com.cn/index.php?a=show_wap&catid=178&id=349964&m=wap&siteid=1
2.东莞淘宝天猫代运营托管外包新媒体品牌昌和盛大电子商务有限...选择【昌和盛大电子商务公司】值得信赖!★东莞淘宝天猫代运营第一品牌电商服务公司,东莞最专业的淘宝天猫运营托管团队为您服务★全国服务热线:4008-222-995http://www.changheshengda.com/
3.兼职猫跨境电商卖家网址导航阿里巴巴外贸学院(peixun.alibaba.com) 中国最专业的外贸电商学习平台,线上提供丰富的点播、直播课程,线下有最专业的团队打造品牌培训:阿里启程、橙功营、阿里寻梦、百团 兼职猫跨境电商之家(adoncn.com) 跨境电商干货分享网站,最新的亚马逊、全球速卖通、eBay、Wish商户平台、敦煌网、Shopify、Lazada、Etsy等电商平台...http://qzjianzhi.com/
1.在家外出旅行时是否值得为我的小毛球支付额外的费用即使是只需...总之,对于是否值得支付每晚几十块钱以保证我的小毛球在我不在的时候得到最好的护理,其实答案取决于多方面因素:包括但不限于个人财务状况、家庭成员之间的情感联系程度、居住地周边资源丰富度以及对宠物福利最高标准设定的严格程度。从宏观角度讲,不管是多少成本,只要它确保了我的小宝贝平安无事,我都会觉得这是非常合理...https://www.lynecx.cn/chong-wu-gou/464700.html
2.二年级上册生字表(二)组词在临写其他左窄右宽的字的时候,学生得心应手。叶老曾说:“ 教是为了达到不需要教。”要使学生写好汉字,交给他们写字方法最重要。 学生在练字的过程中,不能停留在对每一个具体字的认识和练习上, 而应当注意归纳总结字与字之间的区别与联系,去认识和掌握一类字写法的共同点,触类旁通,收到举一反三的效果。 https://www.360wenmi.com/f/filewe6o830j.html
3.关于养猫的简单经验教训特姆得宠物捡流浪猫也行,最好是捡那些出生没多久的小猫,每年繁殖季节经常能看到,也得找一下。毕竟是最可爱的阶段。出生没多久,可能没有太多隐藏的疾病。需要的地方小,性格也没有成型,方便养。 捡到之后建议先找兽医院做一波检查,处理跳蚤,寄生虫什么的。一般也不会太便宜,不过也不会太贵。然后根据兽医的建议选合适的猫粮...https://blog.csdn.net/Etberzin/article/details/122406402
4.第一卷第一期卒中包括脑梗和脑出血,是危害全人类身心健康和生命安全的三大主要疾病之一。而溶栓是目前治疗卒中效果较好的方法,但治疗时间要求控制在发生脑卒中的3~6个小时,真正体现了“时间就是生命”的内涵。但对于很多人而言,并不清楚到底哪个医院能以最快速度溶栓。 https://lib.lchospital.cn/qitafuwu/liaoyineican-guanlilei/2017nian/2018-07-01/731.html
5.注意力营销范文9篇(全文)交叉营销的实质是在拥有一定营销资源的情况下向自己的顾客或者合作伙伴的顾客进行的一种推广手段,这种营销方法最大的特点是充分利用现有资源,在两个具有相关用户需求特点的企业间开展交叉营销,能使各自的潜在用户数量明显增加而不需要额外的营销费用。企业可以通过互换链接、交换广告、共享客户资料和市场情报、战略联盟等手...https://www.99xueshu.com/w/ikey8fq9igow.html
6.猫咪假日托管指南临近假期,猫友们在电梯相遇,尬聊话题从几号出发变成了猫咪的托管问题。平日里几小时的分离都会让主人不放心地通过监控看上两眼,更别说一走一个礼拜了,假日托管可以算做除了上宠物医院之外的第二大难题。 是只能眼一闭赌人品把钥匙委托给任意一个陌生人,还是心一狠堵猫运把猫寄养在小小的笼子里祈祷几天回来它没...https://m.douban.com/note/749050407/
7.招财猫作文(精选45篇)我这只“招财猫”可有点与众不同。它并不是像其它存钱罐一样,存钱的方法千篇一律,在它的最底下有一个红色的按钮,平时如果想给它喂食,只需要按一下那个红色的按钮,它的最底层就会打开一层屏障,屏障就会出现一个大大的裂缝,看到裂缝之后只需要把钱塞进去,就可以给它喂食。听我爸爸说只要存1000次钱进去,它就可...https://www.wenshubang.com/dongwuzuowen/1357213.html
8.看不下去了,家长被忽悠瘸了,娃的英语还是烂尾了跟着最顶级的外教念完所有自拼规则,个把小时,这是学会了还是学废了? 一学就会,下课就废,说到底还是实操不够。 这种英语里的 " 烂尾 " 非常可惜,而造成的原因,主要是两种: 1 过于依赖托管式的英语学习 机构、老师,把知识掰碎了嚼透了再吐给孩子的方式,不见得是好事。 https://www.myzaker.com/article/669ef398b15ec07dda2a7519
9.灵活就业人员档案怎么办?灵活就业档案正确处理方法!灵活就业档案正确处理方法! 不管从事什么工作,个人的档案都是需要保管好的,很多人会问自由职业者的档案也需要托管吗?那是肯定的,自由职业者的档案也是需要进行托管的。只不过很多自由职业者认为档案没有什么作用,所以就会导致很多问题的产生。今天小编就来跟大家讲讲档案一般可以存在哪里的问题,如果你是自由职业者一定...https://www.szdegx.com/dangantuoguan/22449/
10.猫猫托管所·ruyi.ai开发者文档·看云你的猫猫托管所就是他们的不二选择哦!作为育猫员,你需要在30天里细心照顾猫猫,给他喂食、陪他玩耍。通过与猫猫之间的互动,你与猫猫的亲密值会不断增加,达到一定程度就能获得更高的等级哦~ 30天后,猫主人会领走猫猫,到时候看看你获得的等级是什么吧! (2)接口说明 请求方法 POST 请求地址 http://api.ruyi.ai...https://www.kancloud.cn/ruyi-ai/message/930858
11.世界上哪个城市猫最多?2013年诺贝尔文学奖授予加拿大女作家爱丽丝*门罗。爱丽丝*门罗出生于加拿大安大略省的温格姆镇。父亲酷爱写作,母亲身为教师。生活在这样的书香门第,少女时代的门罗就萌生了成为小说家的梦想。19岁那年,门罗还在安大略大学攻读新闻学学士学位时,这位天赋异禀的姑娘就发表了自 己的第一篇短篇小说《影子的维度》,从此她...https://www.shuashuati.com/ti/b30111614cbf4f2885f4ac6193158192.html?fm=bdfb0cb13e04608f0bf35f2c8c36660947
12.宠物店的创业计划书(通用11篇)同样的,为了提高潜在利润,你也可以提供各式各样的印有客户宠物照片的产品,比如:钥匙链、贺卡、日历、杯子、猫子、T恤衫、运动包和汽车保险杠上的贴条。 3、狗的服装与配饰 美国人每年在他们宠物上的花费要超过300亿美元,通过设计、制造和销售狗的名牌服饰可以挣得大把大把的美元。毛线衫和雨衣夹克一定会成为最...https://www.ruiwen.com/chuangyejihuashu/3067982.html
13.寒假托管班方案(精选10篇)寒假托管班方案(精选10篇) 为了确保事情或工作安全顺利进行,时常需要预先制定方案,方案是阐明具体行动的时间,地点,目的,预期效果,预算及方法等的企划案。优秀的方案都具备一些什么特点呢?下面是小编为大家整理的寒假托管班方案(精选10篇),希望对大家有所帮助。 https://www.unjs.com/fanwenku/418578.html
14.work.wjima.com/xxxr13284605据了解,小柠撞茶是通过众筹联营的模式降低了投资门槛,总部托管+日流水分红的模式提升了吸引力,而正是这个变化,吸纳了一大批打工人的投资。 小雀也表示,很多投资人为了快速成立公司开店、赚取收益,就会拉家人、亲戚、朋友一起投资。她就是去年11月参与投资小柠撞茶的,截至今年4月,自己和家人已投入50多万元。 http://work.wjima.com/xxxr13284605
15.www.taizhoufangtongren.com/xxxr40877417值得一提的是,SHEIN的半托管模式如今已经在美国及欧洲五国站点相继上线。 此外,SHEIN赖以成功的柔性按需供应链创新模式和方法论,也通过平台化和产业带出海计划,得以在更多行业尤其是家居、珠宝首饰、配饰等更加追求时尚个性化的非标行业持续落地开花,更多产业带商家和品牌也通过与SHEIN的合作习得数智化柔性供应链的建设并...http://www.taizhoufangtongren.com/xxxr40877417
16.过年回家你的花花草草猫猫狗狗怎么办?这里有些妙招不能寄养不能托管,还有其他办法。 文?小南 “过年把猫带回家一起过年。”小南同事答。 “办好了动物检疫证明?” “用不着,我们开车,捎回去。”一些得意。 “可是我听说你家主子胆儿忒小,不敢出门、不敢见生人?” 所以,只要家里养了宠物、植物的旁友,每逢长期不在家的日子,总会担心它们的生存问题,怎么浇水?https://static.nfapp.southcn.com/content/201701/17/c253429.html
17.www.bilitao.cn/xxxr99340843.shtml就连最铁杆的剧粉都扛不住了,直呼"编剧你清醒一点"。 故事走向完全脱离了生活的轨道,剧情硬生生被掰成了八点档狗血剧。 就在观众们还在消化这波剧情时,新角色庄图南的出现彻底引爆了弹幕。 这位浑身上下都写着"钢铁直男"几个大字的角色,一出场就把整部剧的氛围干到冰点。 http://www.bilitao.cn/xxxr99340843.shtml