为什么我不应该使用Process.GetCurrentProcess()。Kill()来退出我的WinForm应用程序?

时间:2009-03-04 09:08:53

标签: .net termination

现在,当用户想要退出我的应用程序时,我会做一些我必须做的事情(即断开与服务器的连接,保存用户数据......)然后我会执行以下操作:

  • 使用布尔值退出所有主循环
  • 中止仍在运行的线程(通常是我的服务器轮询线程)
  • 请致电Application.Exit();

这需要几秒钟才能退出,并没有任何实际用途(一切都已保存在服务器上,所以我真的不在乎那里发生了什么)

如果我使用它,我立即终止,没有任何我能想到的缺点:

 System.Diagnostics.Process.GetCurrentProcess().Kill();

为什么我不会终止我的进程并让CLR放弃AppDomain?

我知道小心处理你的共享资源(IO文件处理程序等)很重要(所以请不要回答:))但是一旦完成,是否真的有理由干净地退出我的App? / p>

7 个答案:

答案 0 :(得分:12)

终止进程将意味着最终块将不会被执行,甚至可能不会critical finalizer objects,这实际上可能是关键的,并导致系统级资源泄漏。当其他人维护代码时,它也可能导致未来的意外错误,因为他们(或你)将不得不扭曲他们的头,每次他们写一个finally块时都要思考它是否会被执行。

答案 1 :(得分:4)

首先,我认为你的意思是Process.Kill(),而不是Process.TerminateProcess()。其次,杀死这个过程只会把它撕掉。任何清理代码都不会执行,您的应用程序将无法取消终止(例如,如果用户有未保存的数据)。如果你对此感到满意,那就去吧。

答案 2 :(得分:4)

这确实是个好问题!

曾几何时(十多年前)我写了一个VB6应用程序,由于WinINet OCX(或其他任何名称)中的确认错误而终止,由于Web服务器上使用的特定证书说话。

没有办法解决这个错误,我使用了TerminateProcess,而且据我所知,这个应用程序已经在几千台机器上使用了好几年了,我从来没有听说过有关这个黑客的任何问题!

答案 3 :(得分:1)

请记住,如果您正在写入文件/网络流,那么您的写入可能会不完整。

如果您的应用程序已准备好以这种方式处理损坏的数据,那么没有理由不这样做。但是,如果您可以通过其他方式退出,我建议您这样做。

答案 4 :(得分:1)

应该注意finalizers may actually be never executed,因此杀死进程与跳过终结代码的任何其他原因没有太大区别,例如慢终结器或终结器抛出异常。

总而言之,我不会担心关闭应用程序需要几秒钟,特别是如果它立即隐藏所有窗口并为用户“消失”。但是,如果关闭需要几十秒和/或用户可能再次执行应用程序并且它不支持多个实例,则调用Process.Kill可能是一个好主意。

我知道一些 age 终止的应用程序,我希望看到它们有一天只是残酷地杀死自己,而不是让我,用户,这样做(在操作系统重启时特别烦人)

答案 5 :(得分:1)

使用第三方库无法捕获其错误或泄漏,有时唯一的方法就是终止它而不会抛出崩溃的MessageBox,这就是杀死进程。

答案 6 :(得分:0)

为什么不使用System.Environment.Exit(int)?您似乎只想保存代码。对我来说,看到对Exit的调用确实更加清晰,并且你的关闭将更加受控制,终结器和关键终结器将会运行。