这个方法主要是用于项目直接启动后做一下定时任务,则可以直接在
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>();
});
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();
public void exec()
a++;
Console.WriteLine("第{0}次执行", a);
public void Dispose()
_timer?.Dispose();
同样也可以使用继承BackgroundService来代替IHostedService 同样的效果 就直接继承BackgroundService就好 就不需要同时继承IHostedService和IDisposable


之前一直有朋友问,.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也不错。
- 创建一个控制台程序。

- 添加
Host Nuget包。

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

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

- 查看结果

- 代码解析
a. Host配置
.ConfigureHostConfiguration(configHost =>
configHost.SetBasePath(Directory.GetCurrentDirectory());
configHost.AddEnvironmentVariables("ASPNETCORE_");
b. App配置
.ConfigureAppConfiguration((hostContext, configApp) =>
configApp.AddJsonFile("appsettings.json", true);
configApp.AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", true);
configApp.AddEnvironmentVariables();
c. 配置服务及依赖注入注册,注:没有Middleware的配置了。
.ConfigureServices((hostContext, services) =>
services.AddLogging();
services.AddHostedService<TimedHostedService>();
d. 日志配置
.ConfigureLogging((hostContext, configLogging) =>
configLogging.AddConsole();
if (hostContext.HostingEnvironment.EnvironmentName == EnvironmentName.Development)
configLogging.AddDebug();
e. 使用控制台生命周期
.UseConsoleLifetime()
其它详细的可参考:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-2.1
- 添加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页签中添加环境变量来实现。


原文链接: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使用简单的控制台应用程序进行后台进程。 注意WebHost和Host之间的区别。
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...