在 C# 中退出控制台应用程序的命令是啥?
Posted
技术标签:
【中文标题】在 C# 中退出控制台应用程序的命令是啥?【英文标题】:What is the command to exit a console application in C#?在 C# 中退出控制台应用程序的命令是什么? 【发布时间】:2012-05-04 09:21:33 【问题描述】:C# 中用于退出控制台应用程序的命令是什么?
【问题讨论】:
这能回答你的问题吗? How do I specify the exit code of a console application in .NET? 规范是How do I specify the exit code of a console application in .NET?。 对于由 Trace.Assert() 退出(通常是有条件的)及其退出代码(在某些平台上为 134),请参阅this。 【参考方案1】:您可以使用Environment.Exit(0);
和Application.Exit
Environment.Exit(0)
is cleaner.
【讨论】:
只是好奇,是什么让它更干净? 当我通过***.com/a/7865126/1530166 将计时器添加到控制台应用程序时,这对我来说非常有效。 Application.Exit 没有这样做,即使使用***.com/a/37029044/1530166。 @GrantH。它更干净,因为它为底层操作系统提供了一个更有用的错误代码,它退出的原因。 但是,Environment.Exit
要求您具有 SecurityPermissionFlag.UnmanagedCode 权限 - 这对某些人来说可能很麻烦。【参考方案2】:
几个选项,按最合适的顺序排列:
-
从 Program.Main 方法返回一个 int
抛出异常并且不在任何地方处理它(用于意外错误情况)
要在其他地方强制终止,
System.Environment.Exit
(不可移植!见下文)
于 9/2013 年编辑以提高可读性
使用特定的退出代码返回: 正如 Servy 在 cmets 中指出的那样,您可以使用 int
返回类型声明 Main 并以这种方式返回错误代码。所以真的没有必要使用 Environment.Exit 除非您需要使用退出代码终止并且不可能在 Main 方法中执行此操作。很可能你可以通过抛出异常来避免这种情况,如果有任何未处理的异常在那里传播,则在 Main 中返回错误代码。如果应用程序是多线程的,您可能需要更多样板来正确终止退出代码,因此您最好只调用 Environment.Exit。
反对使用Evironment.Exit
的另一点——即使是在编写多线程应用程序时——是可重用性。如果您想在使Environment.Exit
不相关的环境中重用您的代码(例如可能在 Web 服务器中使用的库),则代码将不可移植。在我看来,最好的解决方案仍然是始终使用表示方法达到某种错误/完成状态的异常和/或返回值。这样,您始终可以在任何 .NET 环境和任何类型的应用程序中使用相同的代码。如果您正在编写一个需要返回退出代码或以类似于Environment.Exit
的方式终止的应用程序,那么您可以继续在***别包装线程并根据需要处理错误/异常。
【讨论】:
最后一个选项味道不好。没有程序员想通过抛出异常来退出程序。 正如我所写的“按最合适的顺序”。此外,在某些情况下,抛出异常是正确的方法(例如,当发生不应该发生的意外致命错误时,应用程序将永远无法从中恢复)。我已经更新了答案以澄清。 如果你在Main你可以只返回0、1等并将方法签名标记为返回一个int返回错误代码,你不需要使用Environment.Exit来指定错误代码。 取决于您在调用堆栈中的深度以及您是否在主线程中。调用 Environment.Exit 比构建整个程序以返回到主函数更简单,而不使用异常来展开调用堆栈(这在后台线程中不起作用;要么 ThreadPool 会吞下异常或者会在未处理的情况下将其抛出,无论是主方法或线程中的任何捕获逻辑都不会看到它。 我更改了选项的顺序。抛出异常的好处是使您的代码更容易在不同的可执行环境中作为库重用。【参考方案3】:您可以使用Environment.Exit(0)
和Application.Exit
。
Environment.Exit()
:终止这个进程并给底层操作系统指定的退出代码。
【讨论】:
【参考方案4】:主函数运行完毕后,控制台应用程序将退出。 “回报”将实现这一目标。
static void Main(string[] args)
while (true)
Console.WriteLine("I'm running!");
return; //This will exit the console application's running thread
如果您返回错误代码,您可以这样做,可以从初始线程之外的函数访问:
System.Environment.Exit(-1);
【讨论】:
为什么是负值?以上是关于在 C# 中退出控制台应用程序的命令是啥?的主要内容,如果未能解决你的问题,请参考以下文章
我的C#程序运行后出现“LC.exe已退出,代码为-1”是啥意思,如何解决?
从控制台(Ctrl-C)终止时让我的 PyQt 应用程序退出的正确方法是啥?
是啥导致在单元测试(NUnit 或 MSTest)中从 C# 调用的 C++ 函数与在控制台应用程序中运行的相同代码产生不同的结果?