Main初始化启动定时任务使用AddHostedService

这个方法主要是用于项目直接启动后做一下定时任务,则可以直接在Host宿主中注入你的定时执行类,项目启动后他会默认执行定时任务
Host中可以包含多个IHostedService服务实例。当然,如果是Web应用其中一个就是WebHostHost起来之后,会依次启动所有添加的这些IHostedService服务
Worker就是我们自己定义的一个服务程序。整个系统运行起来后,它会自动调用Worker.StartAsync()方法

public class Program
    {
      
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                }).ConfigureServices((hostContext, services) =>
                {
                    //注意这里 
                    services.AddHostedService<Worker>();
                });
        /// <summary>
        /// 注意需要继承IHostedService
        /// </summary>
        public class Worker : IHostedService, IDisposable
        {
            private Timer _timer;
            public static int a = 0;
            public Task StartAsync(CancellationToken cancellationToken)
            {
                _timer = new Timer(dowork, null, TimeSpan.Zero,
                  TimeSpan.FromSeconds(2));//频率两分钟一次
                return Task.CompletedTask;
            }

            public Task StopAsync(CancellationToken cancellationToken)
            {
                _timer?.Change(Timeout.Infinite, 0);
                return Task.CompletedTask;
            }
            public void dowork(object state)
            {
                exec();
            }
            /// <summary>
            /// 执行代码块
            /// </summary>
            public void exec()
            {
                a++;
                Console.WriteLine("第{0}次执行", a);
            }
            public void Dispose()
            {
                _timer?.Dispose();
            }
        }
    }

实现效果

在这里插入图片描述

小注释

同样也可以使用继承BackgroundService来代替IHostedService 同样的效果 就直接继承BackgroundService就好 就不需要同时继承IHostedServiceIDisposable
在这里插入图片描述
在这里插入图片描述


.Net Core小技巧 - Hosted Services + Quartz实现定时任务调度

背景

之前一直有朋友问,.Net Core + Linux环境有没有类似Windows服务的东西。其实是有的,我了解的方法有两种:

#1 创建一个ASP.Net Core的Web项目(如Web API),然后通过添加中间件(Middleware)的方式来启动任务;

#2 创建一个.Net Core的项目,添加Host,Dependency Injection,Configuration等组件,然后通过Main方法或中间件的方式启动服务。

但是,上述两种方法都有点不足,如:

#1 会把Web的生命周期引进来,但实际上,我们并不需要Web的功能,如Controller
#2 本身是没有问题的,但是对开发者的要求相对高一点点,需要对.Net Core的各个组成部分都有一定的认识,简而言之,门槛有一丢丢高。

.Net Core 2.1推出了一个Generic Host的概念,可以很好的解决上面两种方法的不足:
在这里插入图片描述
至于为什么选择Quartz来做调度,我想可能是因为情怀吧,因为之前是用的TopShelf+Quartz,其实Hangfire也不错。

使用Hosted Service

  1. 创建一个控制台程序。
    在这里插入图片描述
  2. 添加Host Nuget包。
    在这里插入图片描述
  3. 添加一个基于Timer的简单Hosted Service(用于简单演示),继承IHostedService
    在这里插入图片描述
  4. Main函数中添加Host的相关代码。
    在这里插入图片描述
  5. 查看结果
    在这里插入图片描述
  6. 代码解析

a. Host配置

.ConfigureHostConfiguration(configHost =>
{
  //配置根目录

  configHost.SetBasePath(Directory.GetCurrentDirectory()); 

  //读取host的配置json,和appsetting类似,暂不需要先注释掉,可根据需要开启

  //configHost.AddJsonFile("hostsettings.json", true, true); 


  //读取环境变量,Asp.Net core默认的环境变量是以ASPNETCORE_作为前缀的,这里也采用此前缀以保持一致

  configHost.AddEnvironmentVariables("ASPNETCORE_"); 

  //可以在启动host的时候之前可传入参数,暂不需要先注释掉,可根据需要开启

  //configHost.AddCommandLine(args);

})

b. App配置

.ConfigureAppConfiguration((hostContext, configApp) =>
{
  //读取应用的配置json

  configApp.AddJsonFile("appsettings.json", true); 

  //读取应用特定环境下的配置json

  configApp.AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", true); 
  
  //读取环境变量

  configApp.AddEnvironmentVariables(); 

  //可以在启动host的时候之前可传入参数,暂不需要先注释掉,可根据需要开启

  //configApp.AddCommandLine(args);
}) 

c. 配置服务及依赖注入注册,注:没有Middleware的配置了。

.ConfigureServices((hostContext, services) =>
{
  //添加日志Service
  services.AddLogging();
  
  //添加Timer Hosted Service
  services.AddHostedService<TimedHostedService>();
})

d. 日志配置

.ConfigureLogging((hostContext, configLogging) =>
{
  //输出控制台日志
  configLogging.AddConsole();

  //开发环境输出Debug日志
  if (hostContext.HostingEnvironment.EnvironmentName == EnvironmentName.Development)
  {
    configLogging.AddDebug();
  }
})

e. 使用控制台生命周期

.UseConsoleLifetime() //使用Ctrl + C退出

其它详细的可参考:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-2.1

使用Quartz

  1. 添加Host Nuget包。
Install-Package Quartz -Version 3.0.5Install-Package Quartz.Plugins -Version 3.0.5
  1. Quartz配置。

之前Quartz的配置是放在quartz.config里面的,但我更喜欢使用appsettings.json,因此,把配置改成了从appsettings.json

先建一个QuartzOption的类:
在这里插入图片描述
3. 重写JobFactory
在这里插入图片描述
4. 编写Quartz Hosted Service
在这里插入图片描述
5. 准备appsettings.json
在这里插入图片描述
6. 编写一个TestJob
在这里插入图片描述
7. 准备Quartz的调度文件quartz_jobs.xml
在这里插入图片描述
8. 注册Quartz Hosted ServiceTestJob
在这里插入图片描述
9. 查看结果
在这里插入图片描述
10. 补充说明。
Generic Service默认的环境是Production,如果想使用Development环境,可以在项目属性的Debug页签中添加环境变量来实现。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值