2016-01-21 29 views
1

我有一個進程A啓動一個進程B.進程B更改進程A的某些文件,所以我需要在進程B中延遲讓進程A關閉自己。延遲進程開始,直到父進程關閉

目前我已經建立了兩個解決方案。

解決方案1:引用link「我能想到的唯一方法就是編寫第二個等待30秒並加載所需程序的程序,調用該程序並關閉第一個程序,第二個等待30秒然後加載你想要的那個在第一位。「

這項工作,但第三個程序是有點窮窮盡的優雅,如果你知道我的意思。解決方案2:簡單的,在邏輯啓動前(我控制進程A和B),只需在進程B中放置一個Thread.Sleep即可。這個工作也是,並沒有壞主意......

我問,因爲我正在尋找一種方法來將processA上的參數傳遞給processB.start,因此它可以提供更乾淨/優雅的解決方案。

+0

你到目前爲止嘗試過什麼?你可以分享你的代碼,瞭解你如何開始你的流程? Will ['Process.WaitForExit()'](https://msdn.microsoft.com/en-us/library/fb4aw7b8(v = vs.110).aspx)是否有效?顧名思義,它啓動一個進程,然後保存所有執行,直到該進程完成,然後恢復。 – sab669

+0

這不適用於我,我需要的過程A過程之前關閉B星運行,Process.WaitforExit()是相反的。我再說一遍,進程B將嘗試更改進程A的文件,如果進程A正在運行,進程B將無法執行更改。 – Aferrercrafter

+1

將進程A的PID傳遞給進程B,從B打開進程然後執行WaitForExit(),然後執行文件修改 – Gusman

回答

2

有2種實際的方法可以做到這一點。

首先,您可以使用操作系統級別的同步對象,如Mutex。在您的第一個應用程序中,在應用程序關閉前創建新的名爲Mutexrelease。在第二個應用等待Mutex發佈WaitOne

首先進程應創建新的互斥鎖,並阻止其他進程:

Mutex mtx = new Mutex(true, "SomeName"); 
// start second process 
mtx.ReleaseMutex(); 

第二個過程:

Mutex mtx = new Mutex(false, "SomeName"); 

// next line will block current thread until mutex will be released 
mtx.WaitOne(); 

// your logic here 

你也可以check running processes在你的第二個應用程序,然後等到第一個應用程序將關閉:

while(Process.GetProcessesByName("YourFirstProcessName").Any()) 
{ 
    Thread.Sleep(1000); 
} 

請記住,兩種解決方案都涉及到開銷因爲Mutex是操作系統級同步對象,並且Process.GetProcessesByName也調用外部API。

+0

爲什麼複雜化一個非常簡單的任務使用命名互斥,當你可以等待過程結束? – Gusman

+0

@Gusman您可以等待進程退出啓動器代碼,但在問題的情況下,我們需要退出啓動器應用程序代碼。 –