Environment.Exit()和Application.Shutdown()之间有什么区别?

Coo*_*.Wu 20 .net c#

当我调用Application.Shutdown时,有时应用程序无法退出,UI已关闭,但该进程仍在运行.如何关闭所有线程关闭应用程序?请问Environment.Exit()可以关闭所有的线程?或者我们应该调用Win32 API TerminateThread来做到这一点?

EKS*_*EKS 20

Environment.Exit()是一种更残酷的方式来关闭你的应用程序是的,但一般来说,如果你需要你杀死你的应用程序使其关闭然后我认为你以错误的方式看待问题.你应该更好地研究为什么其他线程没有优雅地关闭?

您可以在主窗体上查看FormClosing事件,并关闭挂起应用程序的所有资源,防止它关闭.

这就是我发现资源挂起应用程序的方式.

  1. 在调试模式下启用线程显示(这将允许您查看应用程序正在运行的所有线程)
  2. 以不正确关闭的方式关闭应用程序.
  3. 按Visual Studio中的暂停
  4. 查看线程列表,然后单击它们以查看它们挂起的代码在哪里,现在您可以看到哪些资源阻止您的应用程序关闭转到FormClosing事件并关闭/处置它们.
  5. 重复,直到应用程序关闭正确:)

请注意,调试模式下的线程列表将显示一些运行但不在您控制之下的线程,这些线程几乎有一个名称,当您单击它们时,您会收到一条消息,指出您没有符号.这些可以被忽略

确保你的应用程序正常关闭的原因之一是,如果某些资源(让我们说一个FileStream)没有完成工作,那么使用一些api强制它快速可以使各种"随机"问题进来,比如没有写入的设置/数据文件等.


Sha*_*men 10

  1. 你永远不应该叫TerminateThread
  2. 确保您生成的所有线程都标记为背景,这样当您关闭应用程序时它不会等待它们完成.

  • IsBackground为我解决了这个问题。非常有用,令人惊讶的是它并没有广为人知。 (2认同)