在 Environment.Exit() 上捕获异常
Posted
技术标签:
【中文标题】在 Environment.Exit() 上捕获异常【英文标题】:Catching exception on Environment.Exit() 【发布时间】:2009-05-25 08:24:21 【问题描述】:在我的主函数结束后,我需要返回退出代码 1。但是,我还有一个永远不会结束的线程(while(true))
。所以我设法调用了Environment.Exit(1)。但是我在处理 com 对象时遇到了一些异常......
由于多种原因,我无法更改其他线程代码。你们主张怎么做?
我可以捕获来自 com 对象处理的异常吗?我还有其他返回退出代码的选项吗?
【问题讨论】:
【参考方案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
【讨论】:
以上是关于在 Environment.Exit() 上捕获异常的主要内容,如果未能解决你的问题,请参考以下文章
System.Environment.Exit(0) 不退出程序
当未使用 Environment.Exit() 时,.net 程序可以具都有哪些退出代码?