当生成的进程(“子”)启动更多新进程(“孙子”)时,通过Process.Start
启动的进程似乎有大约26秒的延迟 - 我正试图找到一种方法解决这个问题。具体来说,这是在原始进程(“父”)是ASP.Net网站或Windows服务(两者都试过)时发生的。
我们正在尝试运行服务器端命令行工具来收集信息,在文件系统中进行修改,并在“子”完成后继续其他进程。当通过命令行直接创建“子”时,没有延迟,并且对于某些命令行参数,“子”不会产生新进程,并且没有延迟。但是,使用其他参数,“child”会产生“孙子”(与自身相同的可执行文件,但我们无法修改其代码)并且在第一个进程之前似乎有25-30秒(通常为26秒)的延迟开始了,然后正常运行。
我尝试修改UseShellExecute
属性,CreateNoWindow
属性和WindowStyle
属性,但不起作用。 ErrorDialog
和RedirectStandard*
属性均为false。
我正在使用的代码如下:
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。
答案 0 :(得分:2)
我在执行.bat文件时遇到同样的问题,然后使用来自Windows服务的Process.Start调用git.cmd。如果直接从命令行运行.bat文件,git命令会立即执行,但是只要从Windows服务调用它就会延迟50秒。
归结为权限问题。配置我的Windows服务以用户身份运行(在我的情况下是管理员)后,git进程立即运行。您可以修改服务安装程序以将服务作为“用户”运行,但您可以在安装后修改服务属性以达到相同的效果。
可能有办法启用“本地服务”来解决延迟,但我不知道如何。
答案 1 :(得分:1)
很难说明可能发生这种情况的原因,您需要进行进一步的故障排除。
我建议你使用Process Explorer和Process Monitor来寻找潜在的问题。
我猜这个问题不是直接在你的代码中,而是与用户的环境有关。例如,w3wp.exe进程在非GUI会话(会话0)中运行,并且用户可能未配置为具有Web访问权限(代理配置),因此您可能会在此处看到超时问题。