需求一:軟件要能在操作系統啟動后,自動運行
因為操作系統是windows 10,所以最先想到的是windows服務,因為windows服務有個自動啟動選項,設為true就行了。
.net做這個最合適了,可以建windows服務項目。
需求二:包含N個任務,要求每天、每周、每月都可以執行,時間可自己設置
面對這個需求,很明顯Timer不適合了,最先想到的便是Quartz.net,因為這個東西之前也用過,所以就用它了。滿足需求綽綽有余。
有一點需要說明的是,具體時間是保存在數據庫里面的,服務在從數據庫讀取到時間后,還需要將設置的時間轉換成cron表達式。
需求三:領導說你能在這個windows服務里面提供web api嗎?這樣就不用單獨的再創建一個接口項目了。
一開始想用HttpListener自己寫個簡單的http web服務器,畢竟接口就一個。
但是后來想到這種東西應該有別人寫好的吧,所以就百度了下,發現Nancy比較合適。使用它可以監聽指定端口,提供web服務。
而且,我是通過job將最終需要執行的消息放在隊列里面,然后去消費隊列。沒有用第三方的隊列,用的是ConcurrentQueue。
所以如果另外建web項目,就屬於兩個不同的項目,沒辦法消費隊列了。
注意:在服務停止后,需要關閉后台運行的線程,不然服務雖然停止了,但是未執行完的代碼依然還會執行。
/// <summary> /// 關閉相關后台線程,使得服務結束時,線程也關閉 /// </summary> protected override void OnStop() { //關閉quartz if (!_scheduler.IsShutdown) { _scheduler.Shutdown(); _logger.Info("quartz scheduler has shutdown"); } //關閉http server if (_nancyHost != null) { _nancyHost.Stop(); _logger.Info("http server has stoped"); } //關閉socket檢測 this._checkSocketTimer.Dispose(); _logger.Info("_checkSocketTimer has disposed"); }
特此記下解決方案,以備后用。