2009-02-17 289 views
3

我正在創建一個Windows服務,安裝服務後,它停止並立即啓動,但它不應該是根本。以前,我得到的服務沒有及時響應啓動命令的錯誤,所以我把初始化代碼,並把它在一個線程,現在我在這裏:窗口服務停止並立即啓動,但它不應該

protected override void OnStart(string[] args) 
{ 
    this.EventLog.WriteEntry("ATNotifier Started"); 

    ThreadPool.QueueUserWorkItem(WaitOnEmailsChanged); 
    ThreadPool.QueueUserWorkItem(Init, "IP"); 
} 

的waitonemailschanged線程只需創建一個filesystemwatcher來觀察設置文件(xml文檔)是否被更改,並在該文件中加載數據(如果發生這種情況)。目前,這只是無限期地等待(這是一般情況,因爲這隻會每年更改幾次),因爲沒有對xml文檔進行更改。

Init線程執行各種操作,包括創建和啓動一個System.Timers.Timer對象,它的Elapsed方法是服務的肉。

我不明白爲什麼它會開始,然後立即停止。我還應該注意,eventviewer顯示沒有來自這個應用程序的日誌。

編輯>我試圖創建「適當」的主題,使用了相同的結果,我已經刪除以外的所有創建和定時器像這樣的開始:

protected override void OnStart(string[] args) 
{ 
    this.EventLog.WriteEntry("ATNotifier Started"); 

    m_Timer = new System.Timers.Timer(90000.0); // 1.5 mins 
    m_Timer.Elapsed += new ElapsedEventHandler(m_Timer_Elapsed); 

    m_Timer.Start(); 
} 

,我仍然得到同樣的信息。這幾乎就像OnStart從未被調用過。

回答

3

如果主線程異常終止,它可能會意外停止。

+0

我只是刪除一切,除了用於創建和啓動定時器,具有相同的結果。 – 2009-02-17 22:18:11

0

ThreadPool線程是後臺線程;他們不會保持一個進程的活力。我懷疑你需要一個「適當」的線程...

嘗試:new Thread(SomeCode).Start();或類似。

+0

試過 - 沒有骰子。 – 2009-02-17 22:15:03

3

您發佈的代碼對我沒有意義。爲什麼在創建Timer之前設置一個事件處理程序?

m_Timer.Elapsed += new ElapsedEventHandler(m_Timer_Elapsed); 
    m_Timer = new System.Timers.Timer(90000.0); // 1.5 mins 

這兩條線不應該交換嗎?

+0

儘管你是正確的,但這種改變沒有產生積極的結果。 – 2009-02-17 22:34:48

1

據我記得,你必須主動到服務管理器,該服務已成功啓動報告 - 否則,OnStart方法將返回,若狀態改變尚未見報道,服務經理將假定服務終止,但實際上並未成功加載自身。

報告您的服務爲已成功啓動由服務基類做IIRC,所以添加以下到OnStart方法的底部:

base.OnStart(args); 
+1

base.OnStart(args)在ServiceBase中沒有實現,所以不需要調用。 – Lamar 2009-02-24 05:13:50