2010-08-18 58 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進程立即運行。您可能可以修改服務安裝程序以「用戶」身份運行服務,但您可以在安裝服務屬性後修改服務屬性,以達到相同的效果。

可能有辦法啓用「本地服務」來解決延遲,但我不知道如何。