C# 杀死正在运行的程序的方法以及如何捕获它们?

C# 杀死正在运行的程序的方法以及如何捕获它们?,c#,.net,windows,C#,.net,Windows,我们有不同的方法杀死正在运行的C程序 ctrl+C; 任务栏然后右键单击其图标,然后在弹出窗口中选择“关闭”; 任务管理器,选择其可执行文件名,然后单击结束进程; 控制台窗口,使用kill命令; 也许更多 我在这里要问的是如何在我的C程序中处理它们,以保证我的C程序在可能的情况下优雅地退出。我知道如何捕获ctrl+C,但不知道其他方法。你能帮助我吗?谢谢,在退出时运行代码的最佳保证是finally语句 但是请注意,当您使用此机制时,您的程序必须在try块中运行 我认为,在finally中未执行块

我们有不同的方法杀死正在运行的C程序

ctrl+C; 任务栏然后右键单击其图标,然后在弹出窗口中选择“关闭”; 任务管理器,选择其可执行文件名,然后单击结束进程; 控制台窗口,使用kill命令; 也许更多

我在这里要问的是如何在我的C程序中处理它们,以保证我的C程序在可能的情况下优雅地退出。我知道如何捕获ctrl+C,但不知道其他方法。你能帮助我吗?谢谢,

在退出时运行代码的最佳保证是finally语句

但是请注意,当您使用此机制时,您的程序必须在try块中运行

我认为,在finally中未执行块的唯一时间是:

堆栈溢出异常

来自.NET4

通过任务管理器强制终止非托管进程

拆除电源电缆时整个系统崩溃,例如


用于深入分析。

场景2基本上调用Application.Exit,这相当于正常关闭与进程相关的所有线程。它还触发可用于执行任何其他清理的事件

通过将处理程序附加到WinForms应用程序的Application.ThreadException事件,可以捕获3和4。当任何异常即将从程序中抛出并由运行时处理时,将触发此事件,运行时将终止程序集的执行并清理沙箱。然而,在这一点上,除了向事件日志中写入一些内容或清除任何静态数据(如IoC容器或存储库)之外,您应该做的事情很少,而且这甚至是有问题的,因为如果这些对象中的一个导致了异常,那么在尝试处理最后一个异常时,您很容易抛出另一个异常


基本上,如果您的用户正在使用kill或End Process关闭您的应用程序,则可能存在严重错误,在尝试优雅地捕获此类终止行为之前,您可能应该说明用户这样做的根本原因。

无法捕获。您无法避免杀死一个程序。但是你可以随时订阅kill。想象一下,当人们拔下电源插头时,你是如何陷入困境的

.NET2.0

订阅活动

.NET 3.5

事件

有用的链接


为什么?你想做什么?保证我的C程序优雅地退出你不能。什么技术?WinForms、Console、WPF?用户的可能副本经常试图“杀死”进程,因为它没有响应和/或行为不正常。在这种情况下,操作系统对用户的尊重超过了对流程的尊重,可能没有礼貌地告知用户即将死亡。这是正确的做法。对于.NET 4运行时,最终也会跳过损坏状态异常的块。@Brian Rasmussen-非常感谢;添加到答案中。您错过的一个主要情况是,如果finally块中的代码抛出自己的异常。这尤其糟糕,因为您不仅在抛出异常后不执行任何语句,而且有效地屏蔽了从try/catch部分抛出的任何异常,因为运行时现在必须在返回到旧异常的展开之前处理这个新异常。@KeithS-这是正确的,finally块一直运行到该点,堆栈上更高的任何其他finally块都将运行,对吗?我觉得这属于你曾经有过的机会