现在,当用户想要退出我的应用程序时,我会做一些我必须做的事情(即断开与服务器的连接,保存用户数据......)然后我会执行以下操作:
这需要几秒钟才能退出,并没有任何实际用途(一切都已保存在服务器上,所以我真的不在乎那里发生了什么)
如果我使用它,我立即终止,没有任何我能想到的缺点:
System.Diagnostics.Process.GetCurrentProcess().Kill();
为什么我不会终止我的进程并让CLR放弃AppDomain?
我知道小心处理你的共享资源(IO文件处理程序等)很重要(所以请不要回答:))但是一旦完成,是否真的有理由干净地退出我的App? / p>
答案 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的调用确实更加清晰,并且你的关闭将更加受控制,终结器和关键终结器将会运行。