【问题标题】:Application.Restart leaves processes hangingApplication.Restart 使进程挂起
【发布时间】:2015-04-07 11:15:08
【问题描述】:

当达到某个条件时,我的应用程序会运行 Application.Restart 以重新启动应用程序。这会留下一个进程挂起,因此当应用程序重新启动时,它会抱怨它已经在运行(我有代码来检查是否只允许应用程序的一个实例)。

可以通过调用 Environment.Exit 来消除此过程,但这与 Application.Restart 冲突。 当 Restart 被调用,然后是 Environment.Exit 时,重新启动被中止,应用程序直接退出而不尝试重新启动。

我该如何解决这个问题?

更多信息:

我的主类实例化了一个子类。如果满足某些条件,则此子类调用 Application.Restart。 这会导致 .Net 在主类上调用 FormClosed 事件。此事件调用 Environment.Exit 以确保在用户退出应用程序时关闭所有进程,从而导致重新启动中止。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    Environment.Exit(0) 是 kernel32.dll 中 ExitProcess(0) 的 API 等效项。它立即终止该过程。 Application.ExitApplication.Restart 都可以在主线程处理时挂起。

    对于您的情况,我建议使用 Environment.Exit 并在此之前启动一个新实例:

    System.Diagnostics.Process.Start(Application.ExecutablePath);
    Environment.Exit(0)
    

    这将肯定退出您的应用程序。

    【讨论】:

    • 我添加了一个标志,表明它是否是软件重启,并在您的示例中检查了 Process.Start 周围的标志。这使得进程停止。但是,我的应用程序启动有点太快了,所以当它检查已经存在的进程时,另一个进程还没有完成退出。我通过在检查其他进程之前添加一个简单的 Thread.Sleep 解决了这个问题。
    【解决方案2】:

    您的代码中的某些东西会阻止您的应用程序在重新启动之前正确关闭,因此请确保检查您的代码(即 FormClosed)。尝试使用可执行路径启动一个新进程,然后关闭原始进程。

    System.Diagnostics.Process.Start(Application.ExecutablePath);
    Application.Exit();
    

    希望对您有所帮助..!

    编辑:

    Why is Application.Restart() not reliable?

    这应该会有所帮助,所以可能会重复!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      • 2017-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多