我正在开始一个子进程,该进程应该在以下几行的定义超时时间内结束:
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(),而不会产生额外的流程。
解决方法并不优雅,但确实解决了我的问题。
答案 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/