这个方法主要是用于项目直接启动后做一下定时任务,则可以直接在 Host 宿主中注入你的定时执行类,项目启动后他会默认执行定时任务
Host 中可以包含多个 IHostedService 服务实例。当然,如果是Web应用其中一个就是 WebHost Host 起来之后,会依次启动所有添加的这些 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页签中添加环境变量来实现。
在这里插入图片描述
在这里插入图片描述

原文链接:
https://blog.csdn.net/WuLex IHostedService被注册到Host后,Host启动时,会允许所有注册的IHostedService 注册IHostedService 如下代码注册IHostedService services.AddHostedService(); IHostedService IHostedService示例如下: public class MyService : IHostedService private IServiceProvider _provider { get; } public My 开启一个定时: 根据cron表达式进行时间调度,cron可以精确到秒,大部分表达式格式也是从秒开始。 c := cron.New()默认从分开始,所以加上cron.WithSeconds(),保证定时按照表达式字面意思执行。 func main() { c := cron.New(cron.WithSeconds()) //精确到秒 //定时任务 spec := */1 * * * * ? //cron表达式,每秒一次 c.AddFunc(spec, func() { fmt.Prin 注意事项:.net6中 如果在 后台托管服务中 有任何 异常,则整个 服务将 自动 停止运行,在 .net5 和 asp.net core 3.1 中不会,但是.net6中的行为 是比较好的,因为 既然做后台 托管服务,代码肯定比较重要,推荐 要提前 预先 做好 try{}catch(){} 避免 整个服务停止。托管服务 是以 单例声明周期 注入到容器中,所以不能在 注入瞬时和范围模式 解决办法如下。3. 在 托管服务 代码中 创建 范围服务 并调用。2.在Program.cs 中添加 配置。 没有使用RTOS实时操作系统,一个祼奔的单片机如果要每隔20ms扫描一次按键,100ms让LED变化一次,我们应该怎么做? 第一种实现方法: void main(void) u8 cnt; HardInit(void); while(1) if (cnt++ >=5) cnt = 0; ScanKey();//扫描按键 LED = ~LED; //LED灯取反一次 delay_ms(20); DoSomething(); //做其它事情 使用单例和临时服务 RegisterServices在方法SingletonAndTransient中作为本地函数实现。其中注册了ServiceA,ServiceB,NumberService和控制器类Controller .NET 7 Preview 3 引入的 HostApplicationBuilderIntro在 .NET 6 中,ASP.NET Core 引入了 Minimal API,对于简单的应用使用 Minimal API 我们可以使用非常精简的代码来实现我们的 API,在 .NET 7 Preview 3 中,引入了一个 HostApplicationBuilder ,我们... Marcos Soares通过.NET Core 3.1使用IHostedService在微服务中实现后台任务,然后在Docker上托管应用程序。 ASP.NET Core 1.x和2.x支持IWebHost用于Web应用程序中的后台进程。 .NET Core 2.1和更高版本支持IHost使用简单的控制台应用程序进行后台进程。 注意WebHostHost之间的区别。 ASP.NET Core 2.0中的WebHost(实现IWebHost的基类)是用于向流程提供HTTP服务器功能的基础结构构件,例如,当您实现MVC Web应用程序或Web API服务时。 它提供了ASP.NET Core中所有新的基础结构优点,使您能够使用依赖项注入,在请求管道中插入中间件等。 WebHost使用这些非常相同的IHostedServices进行后台任务。 .NET Core 2. 1. 引言 对于ASP.NET Core应用程序来说,我们要记住非常重要的一点是:其本质上是一个独立的控制台应用,它并不是必需在IIS内部托管且并不需要IIS来启动运行(而这正是ASP.NET Core跨平台的基石)。ASP.NET Core应用程序拥有一个内置的Self-Hosted(自托管)的Web Server(Web服务器),用来处理外部请求。 不管是托管还是自托管,都离不开Host(宿主)。在ASP.NET Core应用中通过配置并启动一个Host来完成应用程序的启动和其生命周期的管理(如下图 想写好中间件,这是基础。 一、前言今天这个内容,基于于ASP.NET Core 3.x。从3.x开始,ASP.NET Core使用了通用主机模式。它将WebHostBuilder放到了通... import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.SimpleScheduleBuilder; import org.quartz.T...