我有一個Web應用程序在IIS中運行,並通過在同一臺機器中託管的WCF與Windows服務進行通信。內部Windows服務執行各種工作,有時處理用戶請求非常繁忙。在第一次,我遇到了Start of Service的問題,因爲它有些時間會花費很多時間開始&最終會拋出錯誤,即服務超時。爲了解決這個問題,我將代碼移到了另一個線程而不是主線程。一切工作正常,但現在我發現,有些時候我收到錯誤的服務停止即1053 Windows服務沒有及時響應
**1053 windows service did not respond in timely fashion**
我的服務調用OnStop()代碼:
protected override void OnStop()
{
// Stop the WCF service
if (myServiceHost != null)
{
myServiceHost.Close();
myServiceHost = null;
}
// Stop the scheduler
if (myScheduleManager != null)
{
myScheduleManager.Stop();
}
// Update the registry value
Logger.GetInstance().LogEvent(this.GetType().Name, LogLevel.INFO, "Updating registry...");
Settings.GetInstance().LastStopTime = DateTime.Now.ToString();
Logger.GetInstance().LogEvent(this.GetType().Name, LogLevel.INFO, "Service stopped.");
}
它通常發生在服務,忙得不亦樂乎。但最終在30-40分鐘後停止。我知道這是由於Windows服務中的超時問題造成的,因爲默認時間很短,因此將其視爲超時。
我的問題避免這種瓶頸的最佳做法是什麼意思是我應該將我的停止相關任務移動到另一個線程&做異步調用以釋放該線程中的資源。但是,如果在發佈資源期間會發生什麼,用戶將啓動服務?
myScheduleManager是Quartz JobScheduler,它調度Service Start上的各種長時間運行的作業。在停止調用myScheduleManager.Stop()時調用Quartz的Shutdown方法,即myQuartzScheduler.Shutdown(true)Quartz等待所有工作完成,這就是爲什麼它需要很長時間才能完成。我不能讓我的計劃調度員。因爲它會使我的工作處於不穩定的狀態。我可以將它與Service的OnStop()中的另一個異步方法分開,並且可以使用取消模式,但是如果用戶在後臺完成作業時再次啓動服務,會發生什麼情況? – 2013-03-12 07:21:14
在這種情況下,是否可以知道該服務的選項正在停止,並且在作業在後臺完成之前不應繼續啓動? – Turbot 2013-03-12 13:32:54