我有一個.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)
{
...
}
}
}
您知道這裏發生了什麼嗎?
因此,您正在編寫一個需要網絡IO啓動的服務。爲什麼不把它放在後臺線程上,以便用戶不必等待? – 2010-02-07 21:06:06
只是因爲那麼它是更難以檢測,如果wcf主機是開放的。當前客戶端在訪問服務之前檢查服務是否處於運行狀態。如果開放使用單獨的線程,我知道的唯一機會就是嘗試訪問服務並等待超時或成功。 – 2010-02-07 21:36:33