儿童过程永远存在

时间:2014-07-12 19:47:44

标签: c# windows process sat-solvers

我正在开始一个子进程,该进程应该在以下几行的定义超时时间内结束:

using (Process process = process.Start(startInfo))
{
    if (!process.WaitForExit(timeOutMilliSeconds))
    {
        if (!process.HasExited())
        {
            process.Kill();
        }
    }
}

子进程是CPU密集型计算引擎(SAT求解器)。我的主程序是用C#编写的,使用 Visual Studio 2013 Windows 7 64位开发。

大多数情况下,上述代码有效,并且完成了正确的进程超时终止。但是在大约5%的情况下,process.Kill()没有明显的效果。子进程仍然有效。

我尝试以较低的优先级启动子进程。在杀死它之前我还试图暂停它。将TASKKILL /F作为外部工具调用并不总是有帮助。我注意到,所有SAT求解器都没有出现这个问题。我有管理权限但不以管理员身份运行主程序。

如何可靠地终止我的应用程序的子进程?

编辑:
除了超出其超时预算外,子进程的行为非常正常,可以使用Process Explorer手动终止(没有管理员提升)。问题是如何确保在超时后没有任何进程继续运行。

解决方法:
我使用 VC ++ 2013 实现了一个超时工具。我现在调用我的工具调用子进程,而不是直接调用子进程。该工具正在使用CreateProcess()TerminateProcess()来启动和停止子进程。 可以直接从C#程序致电CreateProcess()TerminateProcess(),而不会产生额外的流程。
解决方法并不优雅,但确实解决了我的问题。

1 个答案:

答案 0 :(得分:0)

我创建了一个子进程管理库,其中由于双向WCF管道而监视父进程和子进程。如果子进程终止或父进程终止,则通知对方。 还有一个调试器助手可以自动将VS调试器连接到已启动的子进程。

也许您可以用它来控制您的子进程。

项目网站:

http://www.crawler-lib.net/child-processes

NuGet包:

https://www.nuget.org/packages/ChildProcesses https://www.nuget.org/packages/ChildProcesses.VisualStudioDebug/