2011-06-08 72 views
3

我做在C#中這個小窗口服務,我相信我可能做錯了我的線程池代碼,阻止我的Windows服務從完全開始。如果您必須知道,Windows服務似乎只能在服務控制檯上運行時才能完美運行,但它仍表示它正在「啓動」。當我重新啓動我的服務器時,即使我已將其設置爲自動啓動,該服務似乎仍然停止。Windows服務沒有完全啓動

請參閱下面我的代碼:

protected override void OnStart(string[] args) 
{ 
    int itemCount = itemList.Count; 

    this.doneEvents = new ManualResetEvent[itemCount]; 
    for (int i = 0; i < itemCount; i++) 
    { 
     int oId = this.itemList[i]; 
     this.doneEvents[i] = new ManualResetEvent(false); 

     ThreadPool.QueueUserWorkItem(data => 
     { 
      while (this.activated) 
      { 
       DateTime start = DateTime.Now; 

       // my code here 

       // choke point 
       TimeSpan duration = (DateTime.Now - start); 
       if (duration.Milliseconds < CONST_WAITMILLISECONDS) 
        Thread.Sleep((CONST_WAITMILLISECONDS - duration.Milliseconds)); 
       } 

       this.doneEvents[i].Set(); // thread done 

      }, oId); 
     } 

     WaitHandle.WaitAll(doneEvents); 

} 
+1

你有代碼,以一個間接層。對OnStart()**的調用必須及時返回(例如,在30秒內)。否則,操作系統將終止該服務。因此,你需要把當前的邏輯在'的OnStart()'方法()''被催生的OnStart線程,即一個間接層。 – 2011-06-08 03:09:21

回答

2

我想你可以在一個線程裏面包裹的OnStart邏輯。當您收到OnStop事件時,此線程將被關閉。

事情是這樣的:

Thread _ServiceThread; 
protected override void OnStart(string[] args) { 
    _ServiceThread = new Thread(() => { /* your current OnStart logic here...*/ }); 
    _ServiceThread.Start(); 
} 
protected override void OnStop() { 
    _ServiceThread.Stop(); 
} 
+0

謝謝,但我會認爲這是一個在此期間的創可貼解決方案。我真的需要現在發佈這個項目。 – 2011-06-08 02:28:38

+2

+1這不是一個創可貼。它代表了啓動Windows服務的規範形式。 – 2011-06-08 22:49:20

+0

感謝馬特澄清。 – 2011-06-09 15:45:06

3

你被WaitHandle.WaitAll(doneEvents);阻斷OnStart電話。 Windows試圖啓動該服務,但由於WaitAll超時。

你需要讓OnStart完整的,如果你想讓Windows治療服務爲啓動。

+0

嗨,感謝您的快速響應。什麼是更好的解決方案? – 2011-06-08 00:22:50

+0

刪除'WaitHandle.WaitAll的(doneEvents);' – 2011-06-08 00:28:28

+0

但我需要這種邏輯在其整個生命不斷運行循環。我做錯了嗎? – 2011-06-08 00:32:27