2010-08-18 70 views
0

通过Process.Start启动的进程似乎在生成进程(“子进程”)启动更多新进程(“孙子”)时似乎有大约26秒的延迟 - 我正在尝试找到解决这个问题的方法。特别是,当原始进程(“父”)是ASP.Net网站或Windows服务(尝试这两者)时,会发生这种情况。Process.Start生成更多新进程时速度较慢

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

我试过修改UseShellExecute属性,CreateNoWindow属性和WindowStyle属性,没有任何效果。 ErrorDialogRedirectStandard*属性是错误的。

我正在使用的代码如下:

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

哦,我不认为它很重要,因为我见过其他地方引用的问题(但没有解决方案),但exePath我” m使用指向msysgit的git.exe。

+0

盛大儿童进程?在框架中没有内置的类可以让你实现这个功能来避免所有这些产卵? – 2010-08-18 15:40:38

+0

不幸的是,我启动了一个我们无法控制的exe文件,它选择启动自己的新进程,或者我不会遇到这个问题。 – 2010-08-18 18:14:20

+0

您可以检查的另一件事是:当您将代码放入命令行应用程序并调用它时,它是否也很慢? – 2010-08-18 19:30:54

回答

1

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

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

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

+0

奇怪的是,它确实在短时间内解决了。进程监视器是一个很好的建议 - 我会看看发生了什么,并发布更多信息。 – 2010-08-18 18:16:44

+0

进程监视器是我所需要的 - 这个问题最终在serverfault上被更恰当的询问。感谢您的帮助,很久以前。 – 2010-12-01 01:15:42

+0

想要告诉你 - 我们的系统管理员终于找到了答案,这要感谢来自Process Monitor的信息 - 正如hspain所说,它确实是一个权限问题。现在git在一秒之内响应! – 2011-01-16 17:18:17

2

我有这个相同的确切问题执行一个.bat文件,该文件反过来使用Process.Start从一个Windows服务调用git.cmd。如果.bat文件直接从命令行运行,那么git命令会立即执行,但如果从Windows服务调用该命令,则会延迟50秒。

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

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