首页 文章

儿童过程永远存在

提问于
浏览
1

我正在启动一个子进程,它应该在一个定义的超时时间内沿着以下行结束:

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 回答

相关问题