当应用程序死亡时杀死外部进程
我一直在调用一个小块,调用外部可执行文件(在我的情况下是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();
}
您应该使用JobObject
随着JobObject您可以添加子进程。所以如果主进程被终止或关闭,os会终止所有子进程。
源:http://www.xtremevbtalk.com/showpost.php?p=1335552&postcount=22
另一种解决方案是要传递给子对象的父PID。
任何孩子有检查父PID是否存在,如果没有找到杀死自己
没有什么你的进程被终止,你可以做。有人在用TerminateProcess致电时杀死它,在你的程序中没有运行代码。
如果情况更优美(即未处理的异常),则可能会有全局处理程序执行某些您想要的操作。
这样的话我怎么测试?如何编写和运行测试以确保在主进程终止的情况下该进程会被终止? – Agzam 2013-03-04 16:57:50
@Agzam,你需要测试什么 - “所有子进程在主进程正常结束时合理终止”还是其他?如果正常关机 - 您可以通过某种方式通知您的进程退出而不是杀死它。 – 2013-03-04 17:41:04
虽然我看起来不是一个非常简单的解决方案。我会尝试使用jobobjectwrapper.codeplex.com,虽然该项目看起来有点旧,但仍然让我看看我是否可以重用它 – Agzam 2013-03-04 17:22:13
@Agzam我同意你的意见。我不知道PID解决方案是否适合您的情况 – giammin 2013-03-04 17:23:45
@Agzam您是否尝试了Process.Exited Event? http://msdn.microsoft.com/en-us/library/system.diagnostics.process.exited.aspx – giammin 2013-03-04 17:36:30