Windows服務還是比較強大的,這種應用程式沒有使用者介面,可以隨系統的啟動而運行起來,任何使用者訊息可以被寫進Windows事件記錄裡,也可以將服務設定為本地服務,不受使用者限制,可以對服務進行暫停繼續等,但是如果服務是做即時監控的話,還是建議將服務的暫停功能禁掉。
優點說了一堆了,看看實戰吧,所謂的實戰也是從別人的部落格中學習過來的,我這裡就借用一下夢幻Dot Net的一篇部落格——用.Net開發Windows服務初探。講的比較詳細了,我在這裡是要說一下我在建立Windows服務時遇到的一些問題,分享給大家。
————————————————————————————————————————————————————————————————————
首先要說的是安裝Windows服務:
安裝服務需要用到InstallUtil.exe程式,將編譯好的服務應用程式的路徑拷貝下來,進入CMD,找到服務應用程式所在目錄,運行"InstallUtil YourServiceName.exe"。
問題就來了,如果是在系統內容變數中未做設定,這裡就會報錯了,提示InstallUtil命令不可用,那就配置一下環境變數吧,一般目錄都在“C:\Windows\Microsoft.NET\Framework\v4.0.30319”,如果項目版本是4.0的話就設定這個路徑吧,如果這個設定的版本低,還會報出版本比應用程式版本低的錯誤。
上面的問題如果不想麻煩也可以,單擊“開始-->所有程式-->Microsoft Visual Studio 2010-->Visual Studio Tools-->Visual Studio 命令提示(2010)”,後續一樣。
還有一點要注意的是重新編譯的服務都要先卸載掉原來的Windows服務,然後再安裝重新編譯好的Windows服務。
其次要說的是EventLog的屬性設定:
在我的項目中添加了EventLog控制項,他有一個屬性EnableRaisingEvents,Microsoft給出的解釋是“指示該組建是否監視事件記錄的更改情況”,預設為False,如果改為True則安裝好Windows服務之後無法啟動該服務。具體原因暫時不清楚,也許和其他設定有關係吧,如果有明白的童鞋還請指教。
最後貼上我的源碼供大家分享:(不顯示行號了,為了大家拷貝方便)
private bool servicePaused = false;
/// <summary>
/// 啟動服務
/// </summary>
/// <param name="args"></param>
protected override void OnStart(string[] args)
{
eventLog.WriteEntry(" 這個服務在:" + DateTime.Now.ToString() + "被啟動了!");
fileSystemWatcher.EnableRaisingEvents = true;//開始監聽
fileSystemWatcher.IncludeSubdirectories = true;
fileSystemWatcher.Changed += new FileSystemEventHandler(OnFileChanged);
fileSystemWatcher.Created += new FileSystemEventHandler(OnFileCreated);
fileSystemWatcher.Deleted += new FileSystemEventHandler(OnFileDeleted);
fileSystemWatcher.Renamed += new RenamedEventHandler(OnFileRenamed);
}
/// <summary>
/// 停止服務
/// </summary>
protected override void OnStop()
{
}
private void OnFileChanged(Object source, FileSystemEventArgs e)
{
if (servicePaused == false)
{
eventLog.WriteEntry(e.Name + " 這個檔案在:" + DateTime.Now.ToString() + "被改動了!");
}
}
private void OnFileRenamed(Object source, RenamedEventArgs e)
{
if (servicePaused == false)
{
eventLog.WriteEntry(e.Name + " 這個檔案在:" + DateTime.Now.ToString() + "被重新命名了!");
}
}
private void OnFileCreated(Object source, FileSystemEventArgs e)
{
if (servicePaused == false)
{
eventLog.WriteEntry(e.Name + " 這個檔案在:" + DateTime.Now.ToString() + "被建立了!");
}
}
private void OnFileDeleted(Object source, FileSystemEventArgs e)
{
if (servicePaused == false)
{
eventLog.WriteEntry(e.Name + " 這個檔案在:" + DateTime.Now.ToString() + "被刪除了!");
}
}