Environment.Exit需要很长时间才能关闭应用程序。

6

我正在尝试解决一个不太清楚的问题。当调用 Environment.Exit(0) 时,关闭应用程序需要约22秒钟。


if (AppDomain.CurrentDomain.IsDefaultAppDomain())
{
    Environment.Exit(exitCode);
}

你有没有想过背后正在发生什么?我认为可能是一个异常被抛出,但我已经检查了异常对话框中的所有复选框。


4
我看到了你的错误 - 你正在使用 Environment.Exit - Luaan
1个回答

3
幕后发生的事情非常明显,如果您了解.NET应用程序的工作原理以及Environment.Exit的工作方式。
简而言之,Environment.Exit不是退出任意应用程序的最快方法。它仍在等待任何未完成的finalizer运行(如果它们运行得足够快,那么它们只有总共30秒时间)。如果您正在使用套接字,那么finalizers完全可能需要几秒钟才能运行。
当然,检查最简单的方法是使用调试器——在关闭时暂停,您将看到哪些线程实际上正在执行以及它们正在执行的内容。

谢谢,我可以看到很多线程。有没有命令可以退出而不等待线程结束? - ehh
1
@ehh 是的,有几种方法可以做到这一点。但你真的不想这样做 - 实际上,你甚至不应该使用 Environment.Exit。只需确保所有线程都干净、安全地完成,然后像平常一样退出(例如,在你的 Main 方法中使用 return; 或关闭 Windows 窗体应用程序的主窗体)。 - Luaan
我清楚地知道线程应该干净、安全地完成,但为什么不应该使用Environment.Exit? - ehh
1
@ehh 嗯,一旦您正确关闭了所有线程和其他内容,就没有真正使用 Environment.Exit理由。您可以从 Main 中返回,或者关闭 WinForms 应用程序的主窗体(如前所述),整个应用程序将关闭 - 如果没有关闭,则刚刚发现了线程关闭中的错误 :) Environment.Exit 有一种隐藏此类错误的恶劣方式 - 它甚至可以在 finally 语句中间轻松终止线程。它本质上是不安全的 - 它破坏了您与 .NET 之间的许多协议。 - Luaan

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