C# 退出命令行程序的首选方法.第2部分

C# 退出命令行程序的首选方法.第2部分,c#,C#,我试图编辑此问题: 但我的编辑被拒绝了。我不允许发表评论,因此我将冒着重复这个问题的风险 最初的问题是“退出命令行程序的最佳方式是什么”。显然,最好的方法是从Main()返回,但是如果我想从控制台之类的事件处理程序中退出,该怎么办 是退出Main()的唯一方法,就像在事件处理程序中一样,Environment.exit()方法?这可能不安全,因为Environment.Exit()将无法清理 示例代码: class Program { static void Main(string[]

我试图编辑此问题:

但我的编辑被拒绝了。我不允许发表评论,因此我将冒着重复这个问题的风险

最初的问题是“退出命令行程序的最佳方式是什么”。显然,最好的方法是从
Main()
返回
,但是如果我想从
控制台之类的事件处理程序中退出,该怎么办

是退出Main()的唯一方法,就像在事件处理程序中一样,
Environment.exit()
方法?这可能不安全,因为
Environment.Exit()
将无法清理

示例代码:

class Program
{
    static void Main(string[] args)
    {
        Timer t = new Timer(4000);
        t.Elapsed += t_Elapsed;
        t.Start();

        while (true)
        {
            System.Threading.Thread.Sleep(1000);
        }
    }

    static void t_Elapsed(object sender, ElapsedEventArgs e)
    {
        // I want to exit here
    }
}

如果您的程序是单线程的,您可以抛出一个自定义异常,并在
Main()
方法中捕获它。这为您提供了大量执行任何清理(例如,在
finally
块中)以实现优雅退出的机会。像这样:

public class ExitProgramException : Exception { }

public void SomeNestedStuff()
{
    ...
    if (...) throw new ExitProgramException();
    ...
}

public void Main()
{
    try 
    {
        ...
        SomeNestedStuff();
        ...
    }
    catch (ExitProgramException)
    {
        Console.WriteLine("Bye!");
    }
}

但是,如果您的程序是多线程的,那么您需要根据业务逻辑的具体情况实施一些更复杂的优雅退出机制。

由于这是一个新问题,显然不应将其编辑为人们不太可能关注更新的旧问题。我已编辑了您的标题。请参阅“”,其中一致意见是“不,他们不应该”。如果退出代码确实重要,并且有人可能试图实际使用它,则您需要使用
Environment.exit()
,或者需要更新Main()以返回int(该值是您要返回到操作系统的状态代码)。所以,这要视情况而定。所以如果我需要清理,我永远不应该在事件处理程序中退出(程序)?是的,这可能就是答案。我的问题更像是:有没有让Main()返回的“秘密方法”?:-)如果您没有足够的代表来编辑问题,则无法编辑非您的问题。你也不应该试图编辑其他人的问题,让他们成为你自己的问题。但同样,这在事件处理程序中不起作用,对吗?无法在事件处理程序中引发异常并在Main()中捕获它。
Console.CancelKeyPress
的处理程序在线程池线程上运行。它设计为遵循自己的机制中止应用程序。您应该阅读文档:这意味着问题没有答案。