簡體   English   中英

Windows服務立即停止並啟動,但它不應該

[英]windows service stops and starts immediately, but it shouldn't

我正在創建一個Windows服務,在安裝服務后,它立即停止並啟動,但它根本不應該。 以前,我收到的錯誤是服務沒有及時響應start命令,所以我把init代碼拿出來放在一個線程中,現在我在這里:

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永遠不會被調用一樣。

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

你發布的代碼對我沒有意義。 為什么在創建Timer之前設置事件處理程序?

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

不應該交換這兩行嗎?

最常見的問題是EventLog.WriteEntry拋出錯誤,因為沒有與之關聯的EventSource。 請參閱http://msdn.microsoft.com/en-us/library/xzwc042w.aspx

據我所知,您必須主動向服務經理報告該服務已成功啟動 - 否則,OnStart方法將返回,如果尚未報告狀態更改,則服務管理器將假定服務已終止實際上成功加載自己。

將服務報告為已成功啟動由Service基類完成IIRC,因此將以下內容添加到OnStart方法的底部:

base.OnStart(args);

ThreadPool線程是后台線程; 他們不會讓一個過程保持活力。 我懷疑你需要一個“正確的”線程......

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM