編寫一個Windows服務並不是那麼困難,但最初看起來令人望而生畏。
至於沖洗出來的業務邏輯,我通常會先寫一個命令提示符程序,因爲它更容易調試整個很多。
現在,繼續服務。當然,使用Visual Studio創建Windows服務項目。
我該如何保持活躍狀態並在寫入新行時作出響應?我可以使用某種SQLDependency對象來有效地處理新行嗎?
嗯,我不知道你是否可以,但我可以告訴你你需要什麼。你將需要一個線程。如果您在OnStart事件中未創建新線程,則您的服務將立即停止。這個線程可以直接使用.NET的許多線程mechinisim創建,也可以通過某種類型的Timer,FileSystemWatcher(可能不適用於您)或其他可能的方法間接完成。
我該如何處理優雅啓動和關閉 ?
你在OnStop中這樣做。你可以通過發信號通知你的線程,或者通過一個全局變量,來關閉它。然後,由您的線程及時注意到信號並清理並退出線程。如果您處於可能需要20秒以上的時間內,則需要告訴SCM(服務控制管理器)您需要更多時間。如果你沒有停止服務的用戶得到消息說服務沒有響應,最終只會被殺死。
從db中拾取行時,我應該取所有正在等待處理的數據,還是一次只讀取一行?
這是一個商業決定。可能應該取決於每個處理需要多長時間,以便在發生停止時可以及時進行。
假設它已經是一個後臺服務,我會同步處理行嗎?換句話說,沒有必要在後臺線程上處理行?
同樣,這是一個商業決策,但是,我可能會保持同步。
我需要考慮一下賬戶和運行權限?這是部署問題嗎?
那麼,這一切都取決於。 SQL Server是否在同一個盒子上?您是否使用Windows身份驗證?如果SQL不在同一個框中,您將不得不使用用戶帳戶,或者使用Network Service
。當您創建服務項目時,您需要添加一個安裝程序。當你的項目被創建時,你會得到一個組件類 - 在灰色屏幕上,右鍵單擊並選擇Add Installer
。這將創建一個具有兩個已安裝模塊的新組件類。 serviceIntaller1具有諸如服務名稱,顯示名稱和描述以及啓動類型(手動,自動等)的內容。另一個是serviceProcessInstaller1,這是您決定使用哪個登錄帳戶的地方。
任何其他問題或意識到的東西?
呃,可能。但今天早上我還沒有喝咖啡。
真的,最重要的事情就是規劃如何讓線程保持活躍並響應最終的OnStop請求。例如,如果要嘗試使用SqlDependency
類,則可能需要在OnStart中創建一個Manual或AutoResetEvent,啓動您的線程並讓您的線程設置爲SqlDependency
,然後阻止重置事件。然後,在您的OnStop發佈您的重置事件,以便您的線程可以清理並離開。之後,這只是一個滑下山!
玩得開心!
來源
2011-04-15 13:39:17
Jim
這聽起來像你正在使用'ForProcessing'表作爲一種隊列形式。您是否閱讀過/考慮過Service Broker - 它是內置於SQL Server中的。它有一點自己的學習曲線(你可以把大部分邏輯放在一個CLR存儲過程中,所以你仍然主要編寫.NET代碼) – 2011-04-15 14:53:56
如果你剛開始創建服務,這裏是一個在C#中一步一步:http://stackoverflow.com/questions/593454/easiest-language-for-creating-a-windows-service/593803#593803 – 2011-04-15 14:54:05