我正在启动一个子进程,它应该在一个定义的超时时间内沿着以下行结束:
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求解器都没有出现这个问题 . 我有管理权限但不以管理员身份运行主程序 .
What could I do to reliably terminate the child process of my application?
Edited:
除了超出其超时预算外,子进程的行为非常正常,可以使用Process Explorer手动终止(没有管理员提升) . 问题是如何确保在超时后没有进程继续运行 .
Workaround:
我使用VC 2013实现了一个超时工具 . 我现在调用我的工具调用子进程,而不是直接调用子进程 . 该工具使用CreateProcess()和TerminateProcess()来启动和停止子进程 . 可能直接从 C#
程序调用CreateProcess()和TerminateProcess()而不会产生额外的进程 .
解决方法并不优雅,但确实解决了我的问题 .
1 回答
我创建了一个子进程管理库,其中由于双向WCF管道而监视父进程和子进程 . 如果子进程终止或父进程终止,则通知彼此 . 还有一个调试器助手可以自动将VS调试器连接到已启动的子进程 .
也许你可以用它来控制你的孩子过程 .
项目现场:
http://www.crawler-lib.net/child-processes
NuGet包:
https://www.nuget.org/packages/ChildProcesses https://www.nuget.org/packages/ChildProcesses.VisualStudioDebug/