在 Environment.Exit() 中捕获异常

4

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

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

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

3个回答

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被广泛认为是一种不良实践 - http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation。此外,该问题说明他们无法更改其他线程代码。 - RichardOD
1
@RicardOD:正是因为工作线程无法更改,所以您必须使用Thread.Abort而不是建议您链接的易失性布尔标志技术。此外,在进程关闭时使用Thread.Abort可能并不那么糟糕,特别是如果工作线程在while(true)循环之外捕获ThreadAbortException。 - Martin Brown
1
@RichardOD 使用 Thread.Abort 是一个可怕的想法,除了它被设计用于的一种情况 - 在应用程序域卸载期间,中止不遵守规则的线程。进程终止也意味着应用程序域卸载,因此这实际上是一个“不像其他用例那么可怕”的使用情况 :D - Luaan

0

尝试使用:

Environment.ExitCode = 1;

然而,如果另一个线程不是后台线程,你需要让它退出才能结束进程(直到进程退出之前,退出代码都没有意义)。


我已经尝试过这个,但似乎未捕获的异常(在环境退出期间发生)会抹掉这个值。 - Toto

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接