1

我正在启动一个子进程,该进程应在​​定义的超时期限内按照以下几行结束:

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

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

大多数情况下,上面的代码可以正常工作,并且完成了适当的进程超时终止。但在某些 5% 的情况下,process.Kill()没有明显的效果。子进程保持活动状态。

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

我可以做些什么来可靠地终止我的应用程序的子进程?

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

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

4

1 回答 1

0

我制作了一个子进程管理库,其中父进程和子进程通过双向 WCF 管道进行监控。如果子进程终止或父进程相互终止,则会收到通知。还有一个调试器助手可用,它自动将 VS 调试器附加到启动的子进程。

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

项目地点:

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

NuGet 包:

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

于 2015-04-08T23:18:28.623 回答