0

当衍生进程(“子进程”)启动更多新进程(“孙子进程”)时,通过 via 启动的进程Process.Start似乎有大约 26 秒的延迟 - 我正在尝试找到解决此问题的方法。具体来说,当原始进程(“父进程”)是 ASP.Net 网站或 Windows 服务(两者都尝试过)时,就会发生这种情况。

我们正在尝试运行服务器端命令行工具来收集信息,在文件系统中进行修改,并在“子”完成后继续其他进程。当通过命令行直接创建“子”时,没有延迟,并且在某些命令行参数下,“子”不会产生新进程,也没有延迟。但是,使用其他参数时,“子”会产生“孙子”(与自身相同的可执行文件,但我们无法修改其代码),并且在第一个进程之前似乎有 25-30 秒(通常为 26 秒)延迟启动,然后正常运行。

我试过修改UseShellExecute属性、CreateNoWindow属性和WindowStyle属性,没有效果。 ErrorDialog并且RedirectStandard*属性是假的。

我正在使用的代码如下:

using (Process p = new Process())
{
    p.StartInfo = new ProcessStartInfo(exePath, args)
    {
        WorkingDirectory = workingDirectory,
        UseShellExecute = true,
        CreateNoWindow = true,
    };
    p.Start();
    p.WaitForExit();
}

哦,我认为这并不重要,因为我在其他地方看到了这个问题(但没有解决方案),但是我使用的 exePath 指向 msysgit 的 git.exe。

4

2 回答 2

2

我在执行 .bat 文件时遇到了同样的问题,该文件又使用 Windows 服务中的 Process.Start 调用 git.cmd。如果直接从命令行运行 .bat 文件,则 git 命令将立即执行,但在任何时候从 Windows 服务调用它时都会延迟 50 秒。

它归结为权限问题。将我的 Windows 服务配置为以用户身份(在我的情况下为管理员)运行后,git 进程立即运行。您可能可以修改您的服务安装程序以将服务作为“用户”运行,但您可以在安装后修改服务属性以达到相同的效果。

可能有办法启用“本地服务”来解决延迟,但我不知道如何。

于 2010-12-01T16:50:52.690 回答
1

很难说出为什么会发生这种情况的原因,您需要进行进一步的故障排除。

我建议您使用 Process Explorer 和 Process Monitor 来查找潜在问题。

我猜想问题不直接在您的代码中,而是与用户的环境更相关。例如,w3wp.exe 进程在非 GUI 会话(会话 0)中运行,并且用户可能未配置为具有 Web 访问权限(代理配置),因此您可能会在此处看到超时问题。

于 2010-08-18T16:02:28.160 回答