【问题标题】:How can I wait until a Windows process, and its subprocesses, have all exited?如何等到 Windows 进程及其子进程全部退出?
【发布时间】:2010-07-13 00:53:54
【问题描述】:

我们有一个启动器应用程序,它会进行一些设置(启动服务器)、启动子进程、等待(通过工作线程)子进程退出,然后进行一些清理(停止服务器)。这已经到位并且工作正常。

但是,我们的某些应用可以启动其他应用。例如,启动器可能会启动应用程序 A,然后我可能会单击应用程序 A 中启动应用程序 B 的按钮。然后我关闭应用程序 A,启动器的 Process.WaitForExit 调用返回,启动器停止服务器 - 不知道应用 B 仍在运行。我们仅将启动器用于开发测试,因此这不是危机,但当应用 B 尝试与服务器通信并崩溃时,会很不方便。

启动子进程然后等待它(及其任何子进程)退出的最佳方法是什么?

这些应用程序(启动器和正在启动的应用程序)都在 .NET 中。如果我必须在每个应用程序中编写特殊代码(例如打开命名信号量)来完成这项工作,那很好;我只是不确定最好的方法。

如果有某种方法可以只等待 我的 应用程序完成 - 例如,如果我的应用程序启动记事本,我不想想等待记事本关闭;我只想等待需要服务器的应用程序。但这不是一个要求,只是一个细节。

【问题讨论】:

    标签: .net windows process synchronization


    【解决方案1】:

    在启动器应用中更改服务器关闭的条件。如果您的进程名称都没有运行,则仅关闭服务器。您可以定期检查您的进程名称。如果没有找到,请关闭服务器。

    【讨论】:

    • 同意,但除非等待每个子进程完成,否则我想不出另一种方法让它工作。在 App B 关闭之前无法关闭 App A。可能更改启动器以启动所有应用程序。不是启动其他应用的应用。
    【解决方案2】:

    实际上,最简单的方法是让父进程等待其子进程,然后像您一样等待父进程。您可以准确地选择要等待的那些。

    【讨论】:

    • 有趣的可能性——虽然在生产中,我们不希望应用程序相互等待,所以我需要让等待退出的条件像环境变量一样。如果应用程序 A 崩溃,这也将不起作用 - 特别是因为这在开发人员机器上使用,确实不时发生......
    • 另一种可能性是“正确”的方式(由于其复杂性,我不推荐)...将父级包裹在job object中。此解决方案将包括所有进程(例如记事本),并且需要非平凡的 p/Invoke,尤其是对于“所有进程已退出”信号。
    猜你喜欢
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 2010-11-12
    • 2010-09-21
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多