【发布时间】:2009-05-25 08:24:21
【问题描述】:
在我的主函数结束后,我需要返回退出代码 1。但是,我还有一个永远不会结束的线程(while(true))。所以我设法调用了Environment.Exit(1)。但是我在处理 com 对象时遇到了一些异常......
由于多种原因,我无法更改其他线程代码。你们主张怎么做?
我可以捕获来自 com 对象处理的异常吗?我还有其他返回退出代码的选项吗?
【问题讨论】:
在我的主函数结束后,我需要返回退出代码 1。但是,我还有一个永远不会结束的线程(while(true))。所以我设法调用了Environment.Exit(1)。但是我在处理 com 对象时遇到了一些异常......
由于多种原因,我无法更改其他线程代码。你们主张怎么做?
我可以捕获来自 com 对象处理的异常吗?我还有其他返回退出代码的选项吗?
【问题讨论】:
我建议您:附加到 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 是一个糟糕的想法,除了它设计用于的一种情况 - 在 AppDomain 卸载期间,中止不正常运行的线程。进程终止也意味着 AppDomain 有效地卸载,所以这实际上是一个“不像其他人那么糟糕”的用例:D
尝试使用:
Environment.ExitCode = 1;
但是;如果另一个线程不是后台线程,您将需要它退出以结束进程(退出代码在进程退出之前没有意义)。
【讨论】:
您可以通过编写此代码来终止进程 将 myProcess 调暗为 System.Diagnostics.Process = System.Diagnostics.Process.GetCurrentProcess() myProcess.Kill()
或 环境.exit(1) 是杀死所有进程的最佳方法
【讨论】: