簡單的.NET后台定時服務框架


  這里只是一個簡單的后台開發框架。說白了就是為了方便開發,就是單純的想專注於開發業務邏輯,不想每次新建后台服務的時候花太多時間在項目結構,服務安裝,調度處理上。
最簡單的用法就是,把代碼下下來后,直接用vs打開。參照task的例子去寫邏輯就ok了。

框架本身實現了

1.服務安裝
    框架本身是使用Topshelf進行服務安裝,可以設置名稱和描述,安裝后直接可以在,這些都可以直接配置在app.config中
2.任務控制
    框架提供了一個基類:ServiceBase,基類里面實現了 任務休眠和調度
    任務的控制都是通過:Config/ServicesConfig.json配置文件管理

代碼下載下來后的結構如下:

 

下面將使用框架創建一個每隔一分鍾ping一次baidu.com的任務

1.在Services項目的Tasks文件夾中新建一個類 PingTask 繼承於ServiceBase

 

2.PingTask實現Exec方法,在方法中實現ping邏輯 代碼如下

using Services.Common;

namespace Services.Tasks
{
    class PingTask : ServiceBase
    {
        protected override void Exec()
        {
            ExecCmd("ping baidu.com");
        }

        private void ExecCmd(string cmd)
        {
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.FileName = "cmd.exe";
            p.StartInfo.UseShellExecute = false;    //是否使用操作系統shell啟動
            p.StartInfo.RedirectStandardInput = true;//接受來自調用程序的輸入信息
            p.StartInfo.RedirectStandardOutput = true;//由調用程序獲取輸出信息
            p.StartInfo.RedirectStandardError = true;//重定向標准錯誤輸出
            p.StartInfo.CreateNoWindow = true;//不顯示程序窗口
            p.Start();//啟動程序
            //向cmd窗口發送輸入信息
            p.StandardInput.WriteLine(cmd+"&exit");
            p.StandardInput.AutoFlush = true;
            //獲取cmd窗口的輸出信息
            string output = p.StandardOutput.ReadToEnd();

            p.WaitForExit();//等待程序執行完退出進程
            p.Close();
            LogFactory.GetLogger().Info(string.Format("執行命令:{0}; 執行結果:{1}", cmd, ""));
        }
    }
}

 

3.在Config/ServicesConfig.json中添加配置節點

[
  { //每隔一分鍾ping一次baidu.com
    "ServiceName": "ping baidu.com任務",
    "Assembly": "Services.exe",
    "Methods": "Services.Tasks.PingTask",
    "S_Interval": 60 //間隔時間 單位秒
  }
]

4.在App.config修改服務名稱和描述

 

 <appSettings>
    <add key="ServiceName" value="PingService" />
    <add key="Description" value="每隔一分鍾ping一次baidu.com" />
    <add key="DisplayName" value="PingService" />
  </appSettings>

5.服務安裝(注意要在 Release下生成的才會創建服務 在 Program 可以修改)

a.修改Install.bat和UnInstall.bat 確保里面的服務名稱和App.config中的ServiceName一致

b.運行Install.bat

c.打開服務管理器(win+R 輸入 services.msc) 可以看到服務正在運行

 

一個最基礎的服務就完成了,如果想在這個基礎上開啟多個ping服務,分別ping不同的地址

首先,修改PingTask代碼 中的 ExecCmd("ping baidu.com");  改為 ExecCmd(Config.Param);

代碼如下

protected override void Exec()
{
    ExecCmd(Config.Param);
}

修改 Config/ServicesConfig.json 節點 下面是同時ping baidu.com 和 qq.com 的2個任務

[
  { //每隔一分鍾ping一次baidu.com
    "ServiceName": "ping baidu.com任務",
    "Assembly": "Services.exe",
    "Methods": "Services.Tasks.PingTask",
    "S_Interval": 60, //間隔時間 單位秒
    "Param": "ping baidu.com" //自定義參數
  },
  { //每隔一分鍾ping一次qq.com
    "ServiceName": "ping baidu.com任務",
    "Assembly": "Services.exe",
    "Methods": "Services.Tasks.PingTask",
    "S_Interval": 60, //間隔時間 單位秒
    "Param": "ping qq.com" //自定義參數
  }
]

這里主要是利用Param參數進行傳遞需要執行的命令;

然后重啟服務即可。

任務調度支持多種方式

  0.按指定間隔時間執行
       1.每天指定時間執行 每天一次
       2.指定時間執行一次
       3.每天指定開始和結束時間並且按照指定間隔時間執行

完整的配置參數

[
  { //全量配置 每天的 04點到06點執行,每次執行間隔60秒
    "ServiceName": "ping baidu.com任務", //非空服務名稱
    "Assembly": "Services.exe", //非空程序集
    "Methods": "Services.Tasks.PingTask", //非空執行類名 對應業務的類名
    "ExecType": 3, //執行類型 ( 0:按指定間隔時間執行 1:每天指定時間執行 每天一次 2:指定時間執行一次 3.每天指定開始和結束時間並且按照指定間隔時間執行) 可空默認0
    "S_Interval": 60, //間隔時間 單位秒 可空默認60
    "M_Interval": 0, //間隔時間 單位分 可空默認0
    "H_Interval": 0, //間隔時間 單位小時 可空默認0
    "ExecDayTime": null, //ExecType為1時起效 每天指定時間執行 格式 HH:mm:ss 14:00:00 可空
    "ExecDayStartTime": "04:00:00", //ExecType為3時起效 格式 HH:mm:ss 14:00:00 可空
    "ExecDayEndTime": "06:00:00", //ExecType為3時起效 格式 HH:mm:ss 14:00:00 可空
    "ExecTime": null, //ExecType為2時必填 指定時間執行一次 datetime yyyy-MM-dd HH:mm:ss  執行一次后結束
    "Param": "ping baidu.com" //自定義參數
  }
]
View Code
 

框架代碼路徑:框架代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM