我一直在研究一个调用外部可执行文件的小块(在我的例子中为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();
}
答案 0 :(得分:1)
当您的流程终止时,您无能为力。在有人通过TerminateProcess调用将其杀死后,您的流程中就没有代码运行。
如果有更优雅的情况(即未处理的异常),您可能拥有可以接近您想要的全局处理程序。
答案 1 :(得分:1)
您应该使用JobObject
使用JobObject,您可以添加子进程。因此,如果主进程被终止或关闭,则os将终止所有子进程。
来源:http://www.xtremevbtalk.com/showpost.php?p=1335552&postcount=22
另一种解决方案是将子PID传递给子对象。
任何孩子都必须检查父PID是否存在,如果没有找到自杀