如何在C#中强制退出应用程序?

26

我有一个多线程的C#应用程序,并且它有读写锁,但是在一些计算机上会出现超时异常(无法及时获取锁),我需要强制关闭所有线程。 如何在不得到任何额外异常的情况下做到这一点?


4
Environment.FailFast(int) 会尽可能快地终止你的应用程序。 - vcsjones
可能是 https://dev59.com/rnNA5IYBdhLWcg3wL6yx 的重复问题。 - angularsen
5个回答

26
我认为强制退出应用程序的最佳解决方案是使用以下代码行:
Environment.Exit(0)

Environment.FailFast() 会导致运行时异常的发生


1
谢谢 - 这对我来说是最好的解决方案,因为我想避免异常。 - stuzor

25

如果您想在程序出现致命错误后,不让系统显示任何异常信息就将其关闭,您可以使用以下代码:

请注意:以下内容为原文,请不要修改。

Process.GetCurrentProcess().Kill()

19

Environment.FailFast可能是您正在寻找的内容,但请注意其副作用:不会运行任何终结器、finally块或其他任何内容。它确实立即终止了进程。


1
好的,我使用它后出现了以下异常:运行时遇到致命错误。错误地址为0x044f07bd,在线程0xfb0上。错误代码为0x80131623。此错误可能是CLR或用户代码中不安全或不可验证部分中的错误。此错误的常见来源包括COM-interop或PInvoke的用户封送错误,这可能会破坏堆栈。 - armin
2
值得一提的是 Environment.Exit 选项。它们都保证几乎立即退出,但 Exit 不会生成系统事件错误事件并运行 try/finally 终结器。 - angularsen
1
它并不像你所声称的那样“立即”。我尝试了一下,它需要几秒钟的时间才能完成任务。另外两个最佳答案确实可以立即运作。 - Dan W
@DanW - 嗯...也许是因为它执行了所有的错误报告任务?我现在正在阅读文档,但我担心我找不到这三种方法之间微妙差别的细节。直觉告诉我Process.Kill()应该是停止进程最野蛮的方式。我怀疑它调用了TerminateProcess() Win32 API函数。 - Vilx-
@DanW - Environment.Exit()听起来更优雅一些,可能是在.NET本身中实现的;或者它可能是ExitProcess()的包装器。最后,Environment.FailFast()似乎更像是一个调试辅助工具 - 它确实立即停止了所有用户代码,但.NET框架代码仍然会在完全终止进程之前执行一些清理工作(写入事件日志条目,发送数据到错误报告)。 - Vilx-

4

要立即强制退出应用程序,您可以使用Environment.FailFast()

。该方法会终止应用程序并生成一个日志条目,以便在事件查看器中进行记录。


2
如果您正在寻找一个纯C#代码来终止应用程序,那么这可能是一个无关的答案,但是您可以使用系统本地的终止进程形式,例如taskkill命令,它一定会终止您的应用程序。尝试一下吧。首先添加系统引用。
using System.Diagnostics;

无论何时需要终止进程,
String process = Process.GetCurrentProcess().ProcessName;
Process.Start("cmd.exe", "/c taskkill /F /IM " + process + ".exe /T");
  • /F - 强制终止。
  • /T - 终止进程树(进程及其启动的所有其他进程)。
  • /IM - 映像名称或进程名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接