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() + "被刪除了!");
}
}