这个方法主要是用于项目直接启动后做一下定时任务,则可以直接在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就好 就不需要同时继承IHostedService和IDisposable


.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
- 创建一个控制台程序。

- 添加
Host Nuget包。

- 添加一个基于
Timer的简单Hosted Service(用于简单演示),继承IHostedService。

Main函数中添加Host的相关代码。

- 查看结果

- 代码解析
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
- 添加Host Nuget包。
Install-Package Quartz -Version 3.0.5Install-Package Quartz.Plugins -Version 3.0.5
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 Service和TestJob

9. 查看结果

10. 补充说明。
Generic Service默认的环境是Production,如果想使用Development环境,可以在项目属性的Debug页签中添加环境变量来实现。


本文介绍了在.NetCore中使用HostedService实现定时任务的方法,通过创建一个Worker服务并继承IHostedService接口,实现定时执行任务。此外,还探讨了如何利用Quartz进行任务调度,包括配置、JobFactory重写和测试Job的编写,展示了将定时任务与Quartz结合的完整流程。
5868

被折叠的 条评论
为什么被折叠?



