2010-02-07 53 views
1

我有一個.NET窗口服務,它充當某些wcf的主機。在OnStart方法中,服務主機被創建並啓動。該服務被配置爲自動啓動。這適用於Windows 7(32位和64位),它可以在Windows XP Pro SP3上以「網絡啓動」啓動。使用「net start」命令的服務啓動大約需要20秒。爲什麼我的.NET服務在XP啓動時啓動真的很慢

但是,當Windows XP Pro SP3引導時,事件日誌中會有一條超時消息。該服務本身不會啓動失敗,但會執行其依賴項。這個問題可以在各種XP機器上重現。核心數量和內存沒有影響。更新是最新的。

現在它變得好奇:我分析了跟蹤並發現該服務約需60秒才能啓動。因此我添加了對ReqestAdditionalTime(480000)的調用。但是現在該服務需要超過480秒。這種關係很明顯。時間消耗在以下代碼部分:

var asyncResults = new List<IAsyncResult>(); 
foreach (var host in myHosts) 
    asyncResults.Add(host.BeginOpen(null, host)); 


    // wait until finished 
    while (asyncResults.Count != 0) 
    { 
    IAsyncResult ar = asyncResults[0]; 
    if (!ar.IsCompleted) ar.AsyncWaitHandle.WaitOne(1000); 
    if (ar.IsCompleted) 
    { 
     asyncResults.Remove(ar); 
     var co = (ICommunicationObject)ar.AsyncState; 

     try 
     { 
      co.EndOpen(ar); 
     } 
     catch (Exception ex) 
     { 
      ... 
     } 
    } 
} 

您知道這裏發生了什麼嗎?

+0

因此,您正在編寫一個需要網絡IO啓動的服務。爲什麼不把它放在後臺線程上,以便用戶不必等待? – 2010-02-07 21:06:06

+0

只是因爲那麼它是更難以檢測,如果wcf主機是開放的。當前客戶端在訪問服務之前檢查服務是否處於運行狀態。如果開放使用單獨的線程,我知道的唯一機會就是嘗試訪問服務並等待超時或成功。 – 2010-02-07 21:36:33

回答

1

嘿,我通過做一些密集的對數研究發現了這個決議。

在事件日誌中有一些服務,這些服務在服務達到超時後開始。由於我的服務是以特殊用戶身份運行的,因此我可以檢測到兩項服務,這些服務由我自己的服務進行觸發。因此我將這些添加到服務依賴關係中,並且它可以工作。

我想知道是否有文檔,其中列出了wcf的依賴關係。 作爲參考,下面列出的服務,我的服務dependen上:

  • HTTP
  • RPCSS
  • CryptSvc
  • HTTPFilter
  • RasMan驗證

後兩種,其中那些造成僵局。

相關問題