【问题标题】:Catching exception on Environment.Exit()在 Environment.Exit() 上捕获异常
【发布时间】:2009-05-25 08:24:21
【问题描述】:

在我的主函数结束后,我需要返回退出代码 1。但是,我还有一个永远不会结束的线程(while(true))。所以我设法调用了Environment.Exit(1)。但是我在处理 com 对象时遇到了一些异常......

由于多种原因,我无法更改其他线程代码。你们主张怎么做?

我可以捕获来自 com 对象处理的异常吗?我还有其他返回退出代码的选项吗?

【问题讨论】:

    标签: c# exit exit-code


    【解决方案1】:

    我建议您:附加到 ProcessExit 事件以执行任何最后机会清理或... 对线程执行 Thread.Abort 以使其在退出前完成。

    AppDomain.CurrentDomain.ProcessExit +=
    delegate(object sender, EventArgs e)
    {
        Console.WriteLine("Process Exit");
    };
    Thread t1 = new Thread(new ThreadStart(delegate
    {
    try
    {
        while (true)
        {
            Console.WriteLine("test 1");
            Thread.Sleep(500);
        }
    }
    finally
    {
        Console.WriteLine("Terminating t1");
    }
    }));
    
    Thread t2 = new Thread(new ThreadStart(delegate
    {
    try
    {
        while (true)
        {
            Console.WriteLine("test 2");
            Thread.Sleep(500);
        }
    }
    finally
    {
        Console.WriteLine("Terminating t2");
    }
    }));
    
    t1.Start();
    t2.Start();
    Thread.Sleep(2000);
    t2.Abort();
    t2.Join();
    Environment.Exit(1);
    

    【讨论】:

    • Thread.Abort 被广泛认为是不好的做法-interact-sw.co.uk/iangblog/2004/11/12/cancellation。问题还指出他们无法更改其他线程代码。
    • @RicardOD:正是因为无法更改工作线程,您必须使用 Thread.Abort 而非您链接到的文章中建议的 volatile bool 标志技术。在进程关闭中使用 Thread.Abort 也可能不是那么糟糕,特别是如果工作线程在 while(true) 循环之外捕获 ThreadAbortException。
    • @RichardOD 使用Thread.Abort 是一个糟糕的想法,除了它设计用于的一种情况 - 在 AppDomain 卸载期间,中止不正常运行的线程。进程终止也意味着 AppDomain 有效地卸载,所以这实际上是一个“不像其他人那么糟糕”的用例:D
    【解决方案2】:

    尝试使用:

    Environment.ExitCode = 1;
    

    但是;如果另一个线程不是后台线程,您将需要它退出以结束进程(退出代码在进程退出之前没有意义)。

    【讨论】:

    • 我已经尝试过了,但似乎未捕获的异常(发生在 environment.exit 期间)会删除此值。
    【解决方案3】:

    您可以通过编写此代码来终止进程 将 myProcess 调暗为 System.Diagnostics.Process = System.Diagnostics.Process.GetCurrentProcess() myProcess.Kill()

    或 环境.exit(1) 是杀死所有进程的最佳方法

    http://www.zhakkas.com/affiliates/idevaffiliate.php?id=542

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-18
      • 2013-01-04
      • 2017-07-03
      • 2015-05-30
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      相关资源
      最近更新 更多