2012-04-16 71 views
0

我有一個C#的Windows服務。當我試圖阻止它進入停止狀態,並且當我將斷點放入onStop方法中時,它不會被擊中。無法調試什麼是問題。我已經在整個服務中添加了異常處理,並且還處理了未處理的異常處理,但是我沒有收到任何錯誤。它的canStop設置爲true並且使用RequestAdditionalTime()的服務都可以。C#窗口服務OnStop沒有被調用

我也在app.config中設置了legacyUnhandledExceptionPolicy enabled =「true」。但沒有幫助。 對我來說,它看起來像一些線程/資源問題,阻止服務控制管理器調用OnStop方法。或者服務可能處於已經損壞的狀態,並且服務控制管理器無法停止它。它只是將狀態從「停止」更改爲「停止」。

當我嘗試通過將代碼附加到service exe進行調試時,在嘗試停止服務時沒有任何反應。 onstop方法沒有被調用。

Onstart方法啓動一個線程,每30秒鐘進行一次輪詢。假設onStop方法被調用,那麼它會中止這個線程。這是如何開發這項服務的。 有人可以請教我如何調試這個問題?

是否有一些免費的工具可用於調試,如果有一些線程問題或我的線程在OnStart方法是塞滿服務控制管理器可用資源? 請幫助我,這很緊急。

代碼在調用OnStop方法:

try 
{ 
    RequestAdditionalTime(10*60*1000); 
    IntPtr handle = this.ServiceHandle; 
    KServiceStatus.currentState = (int) State.SERVICE_START_PENDING; 
    SetServiceStatus(handle, ref KServiceStatus); 

    RequestAdditionalTime(30000); 

    if ((onStartThread == null) || 
     ((onStartThread.ThreadState & 
      (ThreadState.Unstarted | ThreadState.Stopped)) != 0)) 
    { 
     onStartThread = new Thread(new ThreadStart(KWindowsServiceHandler.OnStart)); 
     onStartThread.Start(); 
    } 

    KServiceStatus.currentState = (int) State.SERVICE_RUNNING; 
    SetServiceStatus(handle, ref KServiceStatus); 
}    

OnStartThread繼續運行,直到服務正在運行。它需要做投票。 如果onStop方法是調用(未被調用)將中止此OnStartThread。

感謝,

卡邁勒

+1

服務線程是否在任何地方包含Thread.Join()?任何其他可避免的硬鎖阻塞等待?如果是這樣,讓它消失。 – 2012-04-16 09:46:02

+0

..並確保所有非主要工作線程的Thread.IsBackground設置爲true,除非那些絕對需要清除清理的線程。 OnStart方法中的 – 2012-04-16 10:04:32

+0

我無法調用thread.join。 onStartThread應該保持運行,每30秒輪詢一次。所以我唯一的選擇是在服務停止時放棄OnStartThread。 – 2012-04-16 10:13:54

回答

0

主要問題是要找到問題所在。所以繼續評論和取消註釋代碼的不同部分,並發現真正的問題.OnStartthread啓動一個進程(啓動一個exe文件)所以我只保留在我的Windows服務中的代碼,並刪除了一切,我能夠重現問題。我所做的就是讓OnStartthread在啓動過程後休眠1秒。 (更合適的做法是啓動流程並捕獲不同的事件以瞭解流程的狀態以及流程何時準備就緒),它就像魔術一樣工作。 這是以某種方式解決了我面臨的問題。

當這種睡眠不存在時,過程將開始,但我無法在OnStop方法上達到斷點,因爲進程(exe)已經開始,但它需要更多的資源才能完全啓動並保持一致, thread.sleep提供所需的資源以便exe完全啓動。

//the code is in OnStartThread 

someProcess.start(); Thread.Sleep(1000);

0

儘量在一點上,要打破執行使用Debugger.Break();。或通過菜單Debug > Attach to process附加到Windows服務進程並在Visual Studio中設置斷點。

更新:如果調試器沒有連接到過程中,你可以做這樣

if (!Debugger.IsAttached) 
    Debugger.Launch(); 

爲什麼不使用System.Threading.Timer做輪詢各30秒?

protected override void OnStart(string[] args) 
{ 
    const int period = 30 * 1000; 
    Timer timer = new Timer(TimerCallback, null, 0, period); 
} 

private void TimerCallback(object state) 
{ 
    // Polling goes here 
} 
+0

我做了這個附加處理> OnStart方法的工作,但是當我停止服務OnStop方法沒有被調用。斷點保持禁用狀態 – 2012-04-16 09:52:38