前言

在进行基于钉钉的H5微应用开发时,会遇到这样的业务场景:需要定时刷接口获取access_token,这是一个调用接口的凭证,本且有效期是两个小时,在过期后我们需要定时去请求获取该token,否则就无法调用接口服务。于是,就有了后台任务的需求。

本文应该算是钉钉H5微应用开发系列的一个补充知识。

如何实现?

前提条件:使用NUGET添加Microsoft.Extensions.Hosting包到项目中。

主角:IHostedService接口

托管服务必须实现IHostedService接口,该接口为主机管理的对象定义了两种方法。
StartAsync(CancellationToken) - StartAsync包含启动后台任务的逻辑。使用Web主机时,StartAsync在服务器启动并且触发IApplicationLifetime.ApplicationStarted后调用。使用Generic Host时,StartAsync会在ApplicationStarted触发之前调用。

实现步骤

(1)业务类继承BackgroundService

BackgroundService 是用于实现长时间运行的 IHostedService 的基类。调用 ExecuteAsync(CancellationToken) 来运行后台服务。 实现返回一个 Task,其表示后台服务的整个生存期。业务类继承该接口可以

实现方法:

Dispose()
Equals(Object)

确定指定的对象是否等于当前对象。

(继承自 Object)

ExecuteAsync(CancellationToken)

此方法在启动 IHostedService 时调用。 该实现应返回一个任务,该任务表示正在执行的长时间运行的操作的生存期。

GetHashCode()

作为默认哈希函数。

(继承自 Object)

GetType()

获取当前实例的 Type。

(继承自 Object)

MemberwiseClone()

创建当前 Object 的浅表副本。

(继承自 Object)

StartAsync(CancellationToken)

当应用程序主机准备好启动服务时触发。

StopAsync(CancellationToken)

当应用程序主机执行正常关闭时触发。

ToString()

返回表示当前对象的字符串。

(继承自 Object)

实例代码:

internal class TokenRefreshService : BackgroundService{private readonly ILogger _logger;public TokenRefreshService(ILogger<TokenRefresh2Service> logger){_logger = logger;}protected override async Task ExecuteAsync(CancellationToken stoppingToken){_logger.LogInformation("Service starting");while (!stoppingToken.IsCancellationRequested){_logger.LogInformation(DateTime.Now.ToLongTimeString() + ": Refresh Token!");//业务逻辑的书写。。。DosomeThing(){...}await Task.Delay(5000, stoppingToken);}_logger.LogInformation("Service stopping");}}

(2)注入服务

在 Startup 的 ConfigureServices 注册

services.AddHostedService<TokenRefreshService>()

一个问题

当项目部署在IIS上的时候, 当应用程序池回收的时候,后台任务是否也会也会停止执行?

答:部署在iis上时选择了无托管代码形式,以往的.net会存在应用程序集回收的情况,在.net core中不会。

参考文献:https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.extensions.hosting.backgroundservice?view=dotnet-plat-ext-3.1

在ASP.NET CORE 运行后台任务:基于IHostedService的托管服务相关推荐

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

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

  2. ASP.NET Core 运行原理解剖[2]:Hosting补充之配置介绍

    在上一章ASP.NET Core 运行原理解剖[1]:Hosting中,我们介绍了 ASP.NET Core 的启动过程,主要是对 WebHost 源码的探索.而本文则是对上文的一个补充,更加偏向于实 ...

  3. ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法

    ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法 一.前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类 ...

  4. ASP.NET Core 实战:基于 Jwt Token 的权限控制全揭露

    一.前言 在涉及到后端项目的开发中,如何实现对于用户权限的管控是需要我们首先考虑的,在实际开发过程中,我们可能会运用一些已经成熟的解决方案帮助我们实现这一功能,而在 Grapefruit.VuCore ...

  5. ASP.NET Core 运行原理解剖[5]:Authentication

    在现代应用程序中,认证已不再是简单的将用户凭证保存在浏览器中,而要适应多种场景,如App,WebAPI,第三方登录等等.在 ASP.NET 4.x 时代的Windows认证和Forms认证已无法满足现 ...

  6. ASP.NET Core 运行原理解剖[4]:进入HttpContext的世界

    本系列文章从源码分析的角度来探索 ASP.NET Core 的运行原理,分为以下几个章节: ASP.NET Core 运行原理解剖[1]:Hosting ASP.NET Core 运行原理解剖[2]: ...

  7. ASP.NET Core 运行原理解剖[3]:Middleware-请求管道的构成

    在 ASP.NET 中,我们知道,它有一个面向切面的请求管道,有19个主要的事件构成,能够让我们进行灵活的扩展.通常是在 web.config 中通过注册 HttpModule 来实现对请求管道事件监 ...

  8. ASP.NET Core 运行原理解剖[1]:Hosting

    SP.NET Core 是新一代的 ASP.NET,第一次出现时代号为 ASP.NET vNext,后来命名为ASP.NET 5,随着它的完善与成熟,最终命名为 ASP.NET Core,表明它不是 ...

  9. javaweb k8s_K8S微服务核心架构学习指南 ASP.NET Core微服务基于K8S 架构师必备Kubernetes教程...

    K8S微服务核心架构学习指南 ASP.NET Core微服务基于K8S 架构师必备Kubernetes教程 课程内容是关于Kubernetes微服务架构学习课程,基于K8S开展ASP.NET核心进行微 ...

最新文章

  1. HTML教程--多页面窗体
  2. 电容触摸屏GT911、GT928、GT9147的使用
  3. struts2 简单登录校验示例
  4. 计算机操作系统指导书,《计算机操作系统》实验指导书-2015
  5. python数据抓取技术与实战训练_师傅带徒弟学Python:项目实战1:网络爬虫与抓取股票数据...
  6. date.gethour_Java LocalDateTime类| 带示例的getHour()方法
  7. SinGAN: Learning a Generative Model from a Single Natural Image
  8. linux挂载时间3秒,linux基础学习(十一) 时间的同步 设备的挂载
  9. 栈在表达式求值中的应用
  10. 《统计学习方法》——感知机
  11. [转载]心存高远 方能获得成功
  12. 使用RateLimiter完成简单的大流量限流
  13. 基于java象棋游戏_基于JAVA技术的中国象棋游戏设计与实现
  14. 实训报告html前端开发,web前端开发实习报告比你想象中简单
  15. 远程时间管理软件 - 工时通
  16. 关于穿越机FPV视频果冻效应的讨论
  17. SDUT-程序设计基础-实验1-顺序结构
  18. POJ1061 青蛙的约会
  19. 创富学第一学习各家之长,史玉柱发展史.-宁可错过100次机会,不瞎投一个项目。...
  20. LeetCode236.最近的公共祖先

热门文章

  1. Eclipse运行jsp文件(基于tomcat),界面404或者显示无法访问
  2. 基于SpringBoot+Mybatis开发的前后端ERP系统Saas平台
  3. 软件项目周报应该怎么写?
  4. 了不起的程序猿,是从猴子进化来的!
  5. Gated Fully Fusion for Semantic Segmentation(GFF)
  6. 如何让win10系统打开照片、图片使用照片查看器
  7. 基于WinCE6.O操作系统的在线流媒体播放软件设计
  8. 使用Xcode检测循环引用
  9. 软件最后一步------打包
  10. Android 10.0取消系统默认的全盘加密(fstab分区加密)