2013-03-04 252 views
0

我一直在調用一個小塊,調用外部可執行文件(在我的情況下是ffmpeg) 然後我寫了一個測試並在調試模式下使用了測試運行器,現在如果我停止調試(終止)它仍然運行ffmpeg。我試圖殺死終結者和IDisposable的過程 - 它仍然運行。我怎樣才能確保這個過程永遠不會像這樣,如果調用者死亡或失敗或被任何方式阻止,ffmpeg可執行文件將被保證被終止。當應用程序死亡時殺死外部進程

我跑的過程中像往常一樣(沒有什麼花哨)

var processInfo = new ProcessStartInfo(ffmpegPath) 
{ 
    UseShellExecute = false, 
    Arguments = arguments, 
    RedirectStandardOutput = true, 
    RedirectStandardError = true, 
    CreateNoWindow = true, 
}; 

using (var ffmpegProc = new Process()) 
{ 
    ffmpegProc.EnableRaisingEvents = true; 
    ffmpegProc.StartInfo = processInfo; 
    ffmpegProc.Start(); 
    ffmpegProc.WaitForExit(); 
} 

回答

1

您應該使用JobObject

隨着JobObject您可以添加子進程。所以如果主進程被終止或關閉,os會終止所有子進程。

源:http://www.xtremevbtalk.com/showpost.php?p=1335552&postcount=22

另一種解決方案是要傳遞給子對象的父PID。

任何孩子有檢查父PID是否存在,如果沒有找到殺死自己

+0

雖然我看起來不是一個非常簡單的解決方案。我會嘗試使用jobobjectwrapper.codeplex.com,雖然該項目看起來有點舊,但仍然讓我看看我是否可以重用它 – Agzam 2013-03-04 17:22:13

+0

@Agzam我同意你的意見。我不知道PID解決方案是否適合您的情況 – giammin 2013-03-04 17:23:45

+0

@Agzam您是否嘗試了Process.Exited Event? http://msdn.microsoft.com/en-us/library/system.diagnostics.process.exited.aspx – giammin 2013-03-04 17:36:30

1

沒有什麼你的進程被終止,你可以做。有人在用TerminateProcess致電時殺死它,在你的程序中沒有運行代碼。

如果情況更優美(即未處理的異常),則可能會有全局處理程序執行某些您想要的操作。

+0

這樣的話我怎麼測試?如何編寫和運行測試以確保在主進程終止的情況下該進程會被終止? – Agzam 2013-03-04 16:57:50

+1

@Agzam,你需要測試什麼 - 「所有子進程在主進程正常結束時合理終止」還是其他?如果正常關機 - 您可以通過某種方式通知您的進程退出而不是殺死它。 – 2013-03-04 17:41:04