应用程序死亡时杀死外部进程

时间:2013-03-04 16:41:59

标签: c# process unmanagedresources

我一直在研究一个调用外部可执行文件的小块(在我的例子中为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();
}

2 个答案:

答案 0 :(得分:1)

当您的流程终止时,您无能为力。在有人通过TerminateProcess调用将其杀死后,您的流程中就没有代码运行。

如果有更优雅的情况(即未处理的异常),您可能拥有可以接近您想要的全局处理程序。

答案 1 :(得分:1)

您应该使用JobObject

使用JobObject,您可以添加子进程。因此,如果主进程被终止或关闭,则os将终止所有子进程。

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

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

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