40

我在工作中维护了许多控制台应用程序,我注意到其中的一件事是它们调用 Environment.Exit(0)。

示例程序如下所示:

public class Program
{
    public static void Main(string[] args)
    {
        DoStuff();
        Environment.Exit(0);
    }
}

我不明白原始程序员这样做的意图是什么?在我看来,即使没有 Environment.Exit 语句,程序也应该正常退出。也就是说,对于其中一个程序,它的控制台窗口即使在它应该关闭之后仍然存在,所以我真的不确定那里发生了什么......

我在这里错过了什么吗?或者在这种情况下应该调用 Environment.Exit 是否有原因?

4

7 回答 7

59

调用 Main 方法的最后一行的唯一原因Exit()是是否可能有其他前台线程正在运行。如果执行刚刚结束,它们将继续运行Main。即使在这种情况下,将一些显式的优雅终止放入其他线程通常是一个更好的主意 - 或者让它们从后台线程开始。

如果您想从其返回不同的退出代码Main,实现此目的的更简单方法是将其声明为 return int

简而言之,我认为你不需要Environment.Exit()在这里,值得问问你的同事他们为什么要使用它——他们可能无法给你一个很好的理由,这是你可以剪掉的另一点绒毛出去。

于 2009-03-28T07:10:18.613 回答
16

基本上,该语句Environment.Exit(0)告诉操作系统这是一个“干净”的退出。还有其他数字,每个数字都有不同的含义,例如,Environment.Exit(1)

但是,需要注意的一点是“Main”已被声明为不返回任何“void”,因此退出代码实际上没有任何意义。

如果您想了解更多有关不同退出代码的信息,请查看此处:

系统错误代码 (0-499)

于 2009-03-28T06:13:27.223 回答
2

这是(兼容性)命令行程序向底层 shell 指示成功或失败,并且继承自旧的 C 风格的主循环,其中 main 函数的原型是

int main(void);

int main(int argc, char *argv[]);

返回值 0 传统上意味着成功,而非零则意味着失败或其他,这取决于程序员的决定。

参考

于 2009-03-28T06:27:31.823 回答
0

当其他应用程序正在等待您的控制台应用程序的结果时,这确实会被使用。例如,SQL Server Reporting Services (SSRS)(工具)可以启动控制台应用程序并等待返回成功的失败响应。Environment.Exit(0) 发送回一个成功的执行消息。

于 2016-05-04T15:01:41.260 回答
0

SSIS中,当您有一个执行流程任务并且您想知道流程是否失败时,此方法很有用。

于 2016-07-24T02:57:06.813 回答
0

.NET Core中,到目前为止,必须使用Environment.Exit来终止他们在 Mac 上的程序。纯粹从返回main不会停止进程,它会一直运行直到用户中止它。像这样的模式:

public class Program
{
    public static void Main(string[] args)
    {
        Environment.Exit(TryRun(args));
    }
}

在我的工作场所很常见,因为我们想同时为 Windows 和 Mac 发货。

于 2019-07-24T04:27:28.800 回答
0

我目前正在Environment.Exit()控制台应用程序中使用,我不想将丑陋的异常文本扔回控制台。相反,我只是注意到这种情况,在屏幕上写一条用户友好的消息,说明发生了什么,然后调用Environment.Exit().

否则,您不需要Main()在基本控制台应用程序中调用它。

于 2020-02-14T16:49:17.480 回答