2010-07-13 200 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