【问题标题】:Killing external process when application dies应用程序死亡时杀死外部进程
【发布时间】:2013-03-04 16:41:58
【问题描述】:

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

【问题讨论】:

    标签: c# process unmanagedresources


    【解决方案1】:

    你应该使用JobObject

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

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

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

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

    【讨论】:

    • 我看起来不是一个非常简单的解决方案。我会尝试使用jobobjectwrapper.codeplex.com,虽然项目看起来有点老,但还是让我看看我是否可以重用它
    • @Agzam 我同意你的看法。不知道PID方案是否适合你的情况
    • @Agzam 您尝试过 Process.Exited 事件吗? msdn.microsoft.com/en-us/library/…
    • @Agzam,如果您决定走这条路,请务必了解操作系统版本差异。据我所知,在 Windows-8 之前的版本中创建子作业有一些严格的限制。
    【解决方案2】:

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

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

    【讨论】:

    • 那么我该如何测试呢?如果主进程终止,我如何编写和运行测试以确保该进程被终止?
    • @Agzam,您需要测试什么 - “所有子进程在主进程正常结束时合理终止”或其他什么?如果正常关闭 - 您可以以某种方式通知您的进程退出而不是杀死它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2014-06-19
    • 1970-01-01
    • 2014-09-16
    • 2013-09-19
    • 1970-01-01
    相关资源
    最近更新 更多