我正在启动一个子进程,该进程应在定义的超时期限内按照以下几行结束:
using (Process process = process.Start(startInfo))
{
if (!process.WaitForExit(timeOutMilliSeconds))
{
if (!process.HasExited())
{
process.Kill();
}
}
}
子进程是 CPU 密集型计算引擎(SAT 求解器)。我的主程序是使用Visual Studio 2013和Windows 7 64-bitC#
编写和开发的。
大多数情况下,上面的代码可以正常工作,并且完成了适当的进程超时终止。但在某些 5% 的情况下,process.Kill()
没有明显的效果。子进程保持活动状态。
我试图以较低的优先级启动子进程。我还试图在杀死它之前暂停它。作为外部工具调用TASKKILL /F
也并不总是有帮助。我注意到,并非所有 SAT 求解器都会出现此问题。我有管理权限,但不以管理员身份运行主程序。
我可以做些什么来可靠地终止我的应用程序的子进程?
已编辑:
除了超出其超时预算外,子进程的行为非常正常,可以使用 Process Explorer 手动终止(无需管理员提升)。问题是如何确保超时后没有进程继续运行。
解决方法:
我使用VC++ 2013实现了一个超时工具。我现在没有直接调用子进程,而是调用我的工具,该工具又调用子进程。该工具使用CreateProcess()和TerminateProcess()来启动和停止子进程。可能可以直接从程序调用CreateProcess()和TerminateProcess()C#
而不产生额外的进程。
解决方法并不优雅,但确实解决了我的问题。