我實現了windows服務與eventLog
和FileSystemWatcher
,查找特定目錄中的更改並將消息寫入MyLog
。windows服務奇怪的行爲
奇怪的事1:
我通過installUtil.exe安裝(因爲VS2012沒有安裝模板),並在某些情況下,當我去「服務」,並啓動服務,我得到:
本地計算機上的[服務名稱]服務已啓動,然後停止。某些服務如果未被其他服務或程序使用,則會自動停止。
我已經見過this question。 2回答這個帖子爲什麼可以這樣:
1)沒有線程從OnStart()
開始。
我使用設計器並在屬性窗口中設置了大部分屬性,並且我從來沒有手動啓動過任何線程,但是在某些情況下一切正常,所以我認爲情況並非如此。
2)OnStart()
方法發生異常。我認爲不是這種情況,因爲我不更改代碼。我只是卸載,構建並重新安裝相同的服務,並且在某些情況下運行,有些則不是。
當我被這個東西卡在mabby 2小時的時候,我注意到的Source
屬性太長:「FilesMonitoringServices」。我將其更改爲「MonitorSource」,一切開始奏效。比我重新安裝了一次,並得到了與上述相同的警告。我再次更改了Source
屬性,現在該服務正在運行。
這是第一件奇怪的事情。
奇怪的事情2:更糟。即使它運行它只記錄OnStart()
和OnStop()
方法,我的意思是fileSystemWatcher事件處理程序永遠不會行爲。這很奇怪,因爲今天我重新安裝了這個服務mabby百倍和它正在工作的3倍,但是在我再次重新安裝它之後,它停止了。而且我根本沒有改變重新安裝之間的代碼。
這裏是我的課(MonitoringService)繼承ServiceBase
的方法和構造:
public MonitoringService()
{
InitializeComponent();
if (!EventLog.SourceExists(eventLog.Source))
{
EventLog.CreateEventSource(eventLog.Source, eventLog.Log);
}
// haven't changed it between the reinstallations
fileWatcher.Path = @"path";
}
protected override void OnStart(string[] args)
{
fileWatcher.EnableRaisingEvents = true;
eventLog.WriteEntry("start", EventLogEntryType.Information);
base.OnStart(args);
}
protected override void OnStop()
{
fileWatcher.EnableRaisingEvents = false;
fileWatcher.Dispose();
eventLog.WriteEntry("stop", EventLogEntryType.Information);
base.OnStop();
}
和文件系統觀察事件處理程序:
private void fileSystemWatcher1_Changed(object sender, FileSystemEventArgs e)
{
using (var conn = new SqlConnection(GetConnectionString()))
{
conn.Open();
var productId = Convert.ToInt32(Regex.Match(e.Name, @"\d+").Value);
const string cmd = "UPDATE Products SET [email protected] WHERE [email protected]";
using (var command = new SqlCommand(cmd, conn))
{
command.Parameters.AddWithValue("@productId", productId);
command.Parameters.AddWithValue("@date", DateTime.Now);
command.ExecuteNonQuery();
}
}
eventLog.WriteEntry(string.Format("{0} has been changed: {1}", e.Name, DateTime.Now), EventLogEntryType.Information);
}
問:在我看來那此行爲不是由我的代碼而是由操作系統設置引起的。它可以這樣嗎?
****編輯:剛剛發現更多具體的東西:**
1)如果顯示消息(當我要啓動服務):
The [service name] service on local computer started and then stopped. ....
我需要改變Source
eventLog
的財產,重建和重新安裝。這個消息不會出現;下一次馬布比。
2)我有以下文件夾層次結構:images/prod-images
。 images
和prod-images
目錄都包含圖像文件。當服務運行時,我從prod-images
文件夾中更改圖像,將消息按要求寫入日誌,並更新數據庫。但是在這個事件發生之後,服務停止! (我檢查了這3次)。當我重新啓動,並再次重複這幾次它更新數據庫,寫日誌,在3D時代,我得到
The [service name] service on local computer started and then stopped. ....
但是,這不是最好的部分),如果我改變是images
圖像目錄我可以多次執行,服務不會停止。 (只有來自images/prod-images
的圖像綁定到數據庫中的條目)。
那麼,mabbe這個功能莫名其妙地反駁數據庫訪問?
編輯2:在visual studio中我使用DEBUG -> Attach to Process
來調試服務。我設置了斷點並更改圖像。第一次事件處理程序完美地執行:數據庫被更新並寫入日誌消息。但是,比我繼續按F11(Step Into)並且這個事件處理程序第二次執行。在生產線
var productId = Convert.ToInt32(Regex.Match(e.Name, @"\d+").Value);
我得到 「FormatException
是未處理」。在此之後,我停止調試並停止服務!就是這樣:事件處理程序中發生異常。
你知道它爲什麼執行第二次?謝謝!
P.S.我已經提交了DavutGürbüz的答案,因爲他指出了我正確的方向。
無論如何,請查看我自己的解答實際問題的答案。
這是一個錯字? '事件日誌。EnableRaisingEvents = TRUE;',而不是'fileWatcher.EnableRaisingEvents = TRUE;' – 2013-02-25 16:56:19
是的,這是一個錯字,對不起 – 2013-02-25 16:59:17