简单的.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" //自定义参数
  }
]
复制代码

转载于:https://www.cnblogs.com/zzp0320/p/8257431.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 .NET Core 中可以使用多种方式来实现定时任务,其中比较常用的是使用 Quartz.NET 和 Hangfire。以下是简单的介绍: 1. Quartz.NET:Quartz.NET 是一个功能强大、开源的定时任务框架,可以支持复杂的调度需求。使用 Quartz.NET 可以通过简单的配置和编程实现定时任务的调度和管理。 2. Hangfire:Hangfire 是一个开源的 .NET 库,可以实现在 ASP.NET 和 .NET Core 应用程序中运行后台任务和定时任务。Hangfire 支持多种存储方式,包括内存、Redis、SQL Server 等,可以非常方便地进行任务调度和管理。 无论使用哪种方式,我们都需要定义任务,例如: ```csharp public class MyJob { public void Run() { // 执行具体的业务逻辑 } } ``` 然后根据具体的框架和需求,配置任务调度和管理,例如: ```csharp // 使用 Quartz.NET var scheduler = new StdSchedulerFactory().GetScheduler(); var job = JobBuilder.Create<MyJob>().Build(); var trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .StartNow() .WithSimpleSchedule(x => x .WithIntervalInSeconds(10) .RepeatForever()) .Build(); scheduler.ScheduleJob(job, trigger); scheduler.Start(); // 使用 Hangfire RecurringJob.AddOrUpdate<MyJob>("job1", job => job.Run(), Cron.Minutely); ``` 其中,Quartz.NET 中的 `Job` 和 `Trigger` 分别表示任务和触发器,Hangfire 中的 `RecurringJob` 表示定时任务。以上只是简单的示例,具体实现还需要根据实际需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值