2013-03-11 163 views
1

我有一個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服務中的超時問題造成的,因爲默認時間很短,因此將其視爲超時。

我的問題避免這種瓶頸的最佳做法是什麼意思是我應該將我的停止相關任務移動到另一個線程&做異步調用以釋放該線程中的資源。但是,如果在發佈資源期間會發生什麼,用戶將啓動服務?

+0

myScheduleManager是Quartz JobScheduler,它調度Service Start上的各種長時間運行的作業。在停止調用myScheduleManager.Stop()時調用Quartz的Shutdown方法,即myQuartzScheduler.Shutdown(true)Quartz等待所有工作完成,這就是爲什麼它需要很長時間才能完成。我不能讓我的計劃調度員。因爲它會使我的工作處於不穩定的狀態。我可以將它與Service的OnStop()中的另一個異步方法分開,並且可以使用取消模式,但是如果用戶在後臺完成作業時再次啓動服務,會發生什麼情況? – 2013-03-12 07:21:14

+0

在這種情況下,是否可以知道該服務的選項正在停止,並且在作業在後臺完成之前不應繼續啓動? – Turbot 2013-03-12 13:32:54

回答

1

只是猜測,但也許這將有助於追查問題:

你有這個myScheduleManager.Stop()其中,(我猜)等待要完成的過程。 這很好,但Windows只給你30秒執行ServiceBase.OnStop()

如果您在此處進行異步處理,則可以使用.NET-Framework中的CancellationToken實現CancellationPattern。

1

最簡單的方法可能可以識別調用OnStop()過程中您的myScheduleManager建立一個boolean類型IsRunning並確定

if (myScheduleManager.IsRunning) 
    myScheduleManager.Stop(); 

但是,你有不同的線程完成可能超過30秒,但你的過程也可以做應用

if (myScheduleManager.IsRunning && !_workerThread.Join(TimeSpan.FromSeconds(30)) 
    _workerThread.Abort 

myScheduleManager.Stop(); 

不過,我並沒有看到完整的代碼片斷所以這是我的猜測,以你的情況下終止你的流程。

1

只是一個猜測,但它可能有所幫助:確保您將解決方案配置設置爲「發佈」而非「調試」。