2010-02-11 70 views
3

我是新來的Windows服務,所以請原諒這篇文章的基本性質。如何保持一個Windows服務(.Net)

我的任務是更新現有的服務,並且對於它們如何工作以及如何在後臺運行有一些疑問。我假設某種循環通常起作用,但在下面的情況下,我不確定它是如何工作的,以及它爲什麼不在短時間內停止。

簡言之,該服務在其的InitializeComponent()部分創建一個對象System.IO.FileSystemWatcher並建立其創建的事件的事件處理程序。

在服務的OnStart方法()中,創建並啓動了一個線程。此線程循環並指示FileSystemWatcher對象查看特定目錄,併爲FileSystemWatcher建立各種設置和選項。無論如何,它不是無限的while()循環;它會執行一些涉及用戶提供的超時值和睡眠等待時間的數學計算,但在任何情況下都會最終退出。

上面提到的FileSystemWatcher事件處理程序反過來將觸發該事件的新創建的文件放到線程安全隊列中,然後創建一個新的或使用現有的線程來處理排隊的文件。隊列處理代碼使用循環來檢查隊列並從中刪除任何項並處理它們。當隊列中沒有項目時,while循環結束並且方法退出。

這些文件中創建的事件是非常稀少的,所以我看不出任何循環會如此忙碌保持運行所有的時間。通過這種邏輯,服務應該停止,或者我會這麼想。但它永遠不會,它始終在運行。

是否有在保持它走,直到調用OnStop或暫停事件被觸發Windows服務的一些無形的消息泵?

我希望這是有道理的,並且道歉,如果我的描述沒有。如果您認爲這可能會有所幫助,我很樂意詳細闡述。感謝您在這裏的解釋。

回答

2

你不需要那個循環。

考慮您的業務類創建FileSystemWatcher,並簽署了它的活動,和所有其他的東西,你的需要。

ServiceBase.OnStart重寫時,您將從您的業務類創建一個實例,並將其放入一個類級變量(例如一個字段)中。

ServiceBase.OnStop覆蓋,你會清理任何你需要的東西。

就是這樣。你不需要處理後臺線程或其他任何東西。

+0

謝謝你(你也是,凱文!)我能問一下保持服務進行的是什麼,它是什麼樣的Windows窗體 - 就像服務啓動時產生的「隱藏線程」? – larryq 2010-02-11 07:25:05

+0

不是一個線程,而是一個過程;如果打開yoir任務管理器並選擇服務選項卡 – 2010-02-11 09:05:02

+1

服務進程有一個線程,則可以看到程序正在運行。所以是的,有一個線程,但不是直接在你的控制之下的線程。在大多數情況下,主服務線程調用OnStart,程序員在那個時候啓動他們自己的線程。當主線程調用OnStop時,它們關閉它們啓動的工作線程。在你的情況下,FileSystemWatcher啓動它自己的線程,所以你不需要它。 – 2010-02-11 21:52:23

1

FileSystemWatcher事件回調發生在與系統線程池分離的線程中。所以即使創建觀察者的線程死亡事件仍然會發生。