我有一個C#應用程序,它使用的Windows服務並非總是處於啓動狀態,我希望能夠在服務啓動和關閉時發送電子郵件通知。我寫了電子郵件腳本,但我似乎無法弄清楚如何檢測服務狀態更改。檢測/監聽服務啓動和停止狀態更改
我一直在閱讀
編輯:由於ServiceController
類,我認爲
WaitForStatus()
方法可能是我需要的,但是我一直未能找到一個示例,它在尚未啓動的服務上使用。
WaitForStatus()
方法busy-waiting,我需要執行由服務運行的程序的其餘部分,同時收聽服務啓動/停止,我不認爲這是方法我,除非有人使用這種方法結合多線程的解決方案,並且乾淨而高效。
更多:
- 該服務將不會被應用程序啓動 - 應用程序的用戶將在管理工具的服務窗口來啓動直接。
- 使用的服務是不是默認的Windows服務 - 它被設計用於這種應用
感謝您的幫助的定製服務!
P.S.請注意,我對C#相當陌生,並且在我去這裏學習。
UPDATE:
我設法得到報警郵件給每個服務啓動時發送:當我繼續通過我的代碼閱讀(我,不幸的是,不能發佈這裏),我注意到用於創建服務的類正在擴展ServiceBase
類,並且有人使用自定義OnStart()
方法來覆蓋默認類。我添加了對新的OnStart()
方法的必要方法調用,併成功發送了通知。
我試圖爲OnStop()
方法做同樣的事情,但對我來說這並沒有那麼好 - 在繼續之前,我想補充一點,我已經用Java編程了好幾年了,而且我非常熟悉Java設計模式。
我試圖做的,這一點在Java工作過,是一個調用電子郵件通知重寫ServiceBase
類的OnStop()
方法,投MyService
是ServiceBase
類型,然後再調用ServiceBase
類的Stop()
方法(注意:OnStop()
是一種受保護的方法,因此無法直接調用 - Stop()
方法調用OnStop()
,然後繼續使用必要的代碼停止服務)。我認爲鑄造ServiceBase
會強制調用默認的OnStop()
方法,而不是我自定義的方法。
正如你可以想像,我結束了剛剛1萬個電子郵件成功發送到我的收件箱之前,我設法在我的電腦強行進入硬關機。
我現在需要的是一種方法,既可以使用我重寫OnStop()
方法,然後把它調用默認的方法,或其他辦法解決這個問題。任何和所有的幫助,非常感謝。非常感謝。
與多線程解決方案你所組成:
protected override void OnStart(string[] args) {
string subject = "Notice: Service Started";
string body = "This message is to notify you that the service " +
"has been started. This message was generated automatically.";
EmailNotification em = new EmailNotification(subject, body);
em.SendNotification();
...INITIALIZE LISTENER FOR SERVICE STOPPING HERE...
...custom stuff to be run on start...
}
而且,記住類調用此方法中,我們稱之爲Service
,擴展了ServiceBase
類。
更新兩個:
的問候,我使用NotifyServerStatusChange
據我瞭解,這是不允許的解決方案中使用的系統功能,由於各種原因的建議。澄清一下,只有純粹在C#和.NET範圍內的解決方案纔是可行的。再次感謝你的幫助!
看看wmi查詢。 – Chriseyre2000 2012-07-30 19:39:53
沒錯,但應用程序沒有檢查事件的狀態 - 它需要持續監聽狀態變化 – 2012-07-30 19:41:56
@ Chriseyre2000:這是一個有效的解決方案,迄今爲止,我只有這個解決方案。如果你想刪除評論並將其作爲答案,我會對它進行投票,因爲它是對此的唯一答案。然而,正如文章本身所說,代碼會變得混亂,我真的不能朝這個方向前進。 – 2012-07-31 12:36:09