2010-11-15 80 views
4

我们有不同的方法来杀死正在运行的C#程序。如何杀死正在运行的程序以及如何截获它们?

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

也许更多。

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

+0

为什么?你想做什么? – SLaks 2010-11-15 16:33:41

+3

“保证我的C#程序优雅地退出”你不能。 – Aliostad 2010-11-15 16:34:48

+0

什么技术? WinForms,控制台,WPF?的 – 2010-11-15 16:36:35

回答

3

在退出时运行代码的最佳保证是最终声明。

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

相信不执行finally内的块的唯一时间是在:

  • StackOverflowException;

  • Corrupted state exceptions(from .NET 4);

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

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

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

+0

对于损坏的状态异常,.NET 4运行时'finally'块也会被跳过。 – 2010-11-15 16:43:31

+0

@Brian Rasmussen - 非常感谢你;添加到答案中。 – 2010-11-15 16:46:06

+0

您错过的一个主要情况是如果finally块中的代码抛出自己的异常。这是特别糟糕的,因为不仅在抛出异常之后你没有执行任何语句,而且还有效地屏蔽了从try/catch部分抛出的任何异常,因为运行时现在必须在返回到展开之前处理这个新的异常旧的。 – KeithS 2010-11-15 16:48:35

0

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

通过将处理程序附加到WinForms应用程序的Application.ThreadException事件,可以“陷入”3和4。当任何异常即将被抛出程序以被运行时处理(这将终止你的程序集的执行和清理沙盒)时,这个事件被触发。但是,在这一点上,除了向事件日志写入内容或清理任何静态内容(例如IoC容器或存储库)之外,您应该做的事情很少,甚至存在问题,因为如果其中一个对象导致异常,您可以非常轻松地试图处理最后一个例外时抛出另一个例外。基本上,如果你的用户使用“kill”或“End Process”来关闭你的应用程序,那么有一些非常错误的东西,你应该解决为什么用户会这样做的基本原因,然后试图正常地捕获这样的东西终止行为。

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?

+0

另外[A​​ppDomain.CurrentDomain.UnhandledException](http://msdn.microsoft.com/zh-cn/library/system.appdomain.unhandledexception.aspx) – Brian 2010-11-15 16:52:57

相关问题