2010-07-13 111 views
1

我们有一个启动程序,它执行一些设置(启动服务器),启动子进程,等待(通过工作线程)子进程退出,然后执行一些清理(停止服务器)。这已经到位并且工作正常。如何等待Windows进程及其子进程全部退出?

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

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

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

奖励点,如果有一些方法只能等待的应用程序来完成 - 例如,如果我的应用程序启动记事本,我希望等待记事本,关闭;我只想等待需要服务器的应用程序。但这不是要求,只是一个很好的。

回答

0

更改在启动器应用程序中关闭的服务器的状况。只有关闭服务器,如果没有进程名称正在运行。您可以定期检查您的流程名称。如果找不到,请关闭服务器。

+0

轮询不完全优雅,但这可以工作。 – 2010-07-13 01:26:54

+0

同意,但我想不出另一种方式让它工作,除非等待每个子进程完成。在App B关闭之前无法关闭App A。可能更改启动程序以启动所有应用程序。不是启动其他应用的应用。 – jdot 2010-07-13 01:32:45

0

实际上,最简单的方法是让父进程等待其子进程,然后等待父进程。你可以选择确切的那些等待那种方式。

+0

有趣的可能性 - 虽然在生产中,我们不希望应用程序彼此等待,所以我需要在环境变量等条件下进行等待退出。这也不会工作,如果应用程序A崩溃 - 尤其是,因为这是在开发机器上使用,确实发生不时... – 2010-07-13 01:22:48

+1

另一种可能性是“正确”的方式(我不推荐由于其复杂性)...将父项包装在[作业对象](http://www.microsoft.com/msj/0399/jobkernelobj/jobkernelobj.aspx)中。该解决方案将包括所有进程(例如记事本),并且需要非平凡的p/Invoke,特别是对于“所有进程已退出”信号。 – 2010-07-13 01:45:32