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();
}
4

2 回答 2

1

当您的进程终止时,您无能为力。在有人用TerminateProcess调用杀死它后,您的进程中没有代码运行。

在更优雅的情况下(即未处理的异常),您可能有全局处理程序来做一些接近您想要的事情。

于 2013-03-04T16:50:23.463 回答
1

你应该使用JobObject

使用 JobObject,您可以添加子进程。因此,如果主进程被杀死或关闭,操作系统将终止所有子进程。

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

另一种解决方案是将父 PID 传递给子对象。

任何孩子都必须检查父 PID 是否存在,如果没有找到就杀死自己

于 2013-03-04T16:52:24.007 回答