代码之家  ›  专栏  ›  技术社区  ›  Brann

为什么我不应该使用Purrest.GeCurrTrimeActudio()?KLE()来退出我的WrFrm应用程序?

  •  23
  • Brann  · 技术社区  · 16 年前

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

    • 用布尔运算退出我所有的主循环
    • 中止仍在运行的线程(通常,我的服务器轮询线程)
    • 请调用Apple。Ext();

    这需要几秒钟的退出,并没有真正的目的(所有的东西都已经保存在服务器上了,所以我真的不关心那里发生了什么)。

    如果我改用这个,我可以立即终止合同,而且没有任何缺点:

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

    为什么我不终止我的进程并让clr删除appdomain呢?

    我知道仔细处理你的共享资源(IO文件处理程序等)是很重要的(所以请不要回答:))但是一旦完成,有没有一个真正的理由来干净地退出我的应用程序?

    7 回复  |  直到 16 年前
        1
  •  12
  •   Hosam Aly    16 年前

    终止进程意味着最终将不会执行块,甚至可能不会 critical finalizer objects ,这实际上可能非常关键,并在系统级别导致资源泄漏。当其他人维护代码时,它也可能在将来导致意外的错误,因为他们(或您)将不得不绞尽脑汁,每次编写finally块时都必须考虑是否将执行它。

        2
  •  4
  •   Dan Byström    16 年前

    这确实是个好问题!

    有一次(十多年前),我写了一个vb6应用程序,由于wininet ocx中的一个已确认的错误(或它被调用的任何东西)而在终止时挂起,原因是它正在与一个web服务器上使用的特定证书。

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

        3
  •  4
  •   Tim Cooper    13 年前

    首先,我想你是说 Process.Kill() ,不是 Process.TerminateProcess() 是的。其次,扼杀这一进程只会破坏它。任何清理代码都不会执行,应用程序也不会有机会取消终止(例如,如果用户有未保存的数据)。如果你对此感到满意,那就去做吧。

        4
  •  1
  •   Richard Szalay    16 年前

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

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

        5
  •  1
  •   Community CDub    7 年前

    应该指出的是 finalizers may actually be never executed ,因此终止进程与跳过终结代码的任何其他原因(如慢速终结器或引发异常的终结器)没有太大区别。

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

    我知道有些申请需要 年龄 要终止,我希望有一天他们会残忍地自杀,而不是让我,用户,去做(这在操作系统重启时特别烦人)。

        6
  •  1
  •   CA Martin    11 年前

    使用第三方库时无法捕获错误或泄漏,有时在不抛出崩溃消息框的情况下结束错误或泄漏的唯一方法是终止进程。

        7
  •  0
  •   Matt Ellis    16 年前

    为什么不使用 System.Environment.Exit(int) 是吗?看起来你这样做只是为了保存代码。对我来说,更清楚地看到退出的调用,并且您的关机将更加受控,终结器和临界终结器将运行。

    推荐文章