2013-03-04 160 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