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

时间:2010-11-15 16:31:51

标签: c# .net windows

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

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

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

3 个答案:

答案 0 :(得分:3)

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

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

我相信finally内部阻止的唯一时间是:

  • A StackOverflowException;

  • Corrupted state exceptions(来自.NET 4);

  • 通过任务管理器强制终止(非托管进程终止);

  • 整个系统崩溃(例如移除电源线)。

See Keep Your Code Running with the Reliability Features of the .NET Framework进行深入分析。

答案 1 :(得分:0)

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

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

基本上,如果您的用户正在使用“kill”或“End Process”关闭您的应用程序,那么就会出现一些非常错误的内容,您应该在尝试优雅地捕获此类终止之前解决用户为何会这样做的根本原因的行为。

答案 2 :(得分:0)

无法陷阱。你无法避免杀死一个程序。但你总是可以订阅杀人。只需想象当人们拉动电源插头时你如何陷阱......

.NET 2.0

订阅AppDomain.CurrentDomain.ProcessExit活动

.NET 3.5

Application.Exit活动

有用的链接

AppDomain.CurrentDomain.ProcessExit and cleanup

How to detect when application terminates?

How to detect when main thread terminates?