.NET Core 实现后台任务(定时任务)IHostedService(一)
原文链接:https://www.cnblogs.com/ysmc/p/16456787.html
最近有小伙伴问道,在 .Net Core 中,如何定时执行任务,而因为需要执行的任务比较简单,并不想使用其它的中间件(如 Quartz 等等),在这样的需求下,我给大家介绍一下.Net 内置的后台任务 IHostedService。
贯彻本人的习惯,不废话,直接上代码,首先我们创建一个类,该类继承 IHostedService 接口,并实现该接口成员,同时我用到了 .NET内置的定时器类 Timer,具体这个 Timer 是什么,我这里就不介绍了,有兴趣的小伙伴可以到官方文档了解 传送门。
在不需要定时执行任务的时候,也可以在这里进行应用启动后的操作,例如创建 RabbitMQ 连接【手动狗头】
同时,我们需要在 Program.cs(.Net 5 及一下在 Startup.cs)中添加以下配置。
// .Net 6
builder.Services.AddHostedService<TestHostedService>(); // .Net 5 及以下
services.AddHostedService<TestHostedService>();
1 public class TestHostedService : IHostedService, IDisposable
2 {
3 private Timer? _timer;
4
5 public Task StartAsync(CancellationToken cancellationToken)
6 {
7 _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
8
9 return Task.CompletedTask;
10 }
11
12 private void DoWork(object? state)
13 {
14 Console.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss}");
15 }
16
17 public Task StopAsync(CancellationToken cancellationToken)
18 {
19 Console.WriteLine("StopAsync");
20
21 return Task.CompletedTask;
22 }
23
24
25 public void Dispose()
26 {
27 _timer?.Dispose();
28 }
29 }
上面的代码非常简单,应用在运行后,会去执行 StartAsync 函数,应用关闭执行 StopAsync,由于我在这里使用的定时器,所以每过5秒都会执行一次 DoWork 函数,以下是运行效果

需要注意的是,这里的定时是不等待任务执行完成,只要时间一到,就会调用 DoWork 函数,所以适合一些简单、特定的场景,后续我将针对这些问题多写几个文档,大佬们有什么建议尽管提,加油!
以下为官方文档对 IHostedService 接口 的说明
IHostedService 接口
IHostedService 接口为主机托管的对象定义了两种方法:
- StartAsync(CancellationToken)
- StopAsync(CancellationToken)
StartAsync
StartAsync(CancellationToken) 包含用于启动后台任务的逻辑。 在以下操作之前调用 StartAsync:
- 已配置应用的请求处理管道。
- 已启动服务器且已触发 IApplicationLifetime.ApplicationStarted。
StartAsync 应仅限于短期任务,因为托管服务是按顺序运行的,在 StartAsync 运行完成之前不会启动其他服务。
StopAsync
- StopAsync(CancellationToken) 在主机执行正常关闭时触发。
StopAsync包含结束后台任务的逻辑。 实现 IDisposable 和终结器(析构函数)以处置任何非托管资源。
默认情况下,取消令牌会有五秒超时,以指示关闭进程不再正常。 在令牌上请求取消时:
- 应中止应用正在执行的任何剩余后台操作。
StopAsync中调用的任何方法都应及时返回。
但是,在请求取消后,将不会放弃任务,调用方会等待所有任务完成。
如果应用意外关闭(例如,应用的进程失败),则可能不会调用 StopAsync。 因此,在 StopAsync 中执行的任何方法或操作都可能不会发生。
若要延长默认值为 5 秒的关闭超时值,请设置:
- ShutdownTimeout(当使用通用主机时)。
- 使用 Web 主机时为关闭超时值主机配置设置。
托管服务在应用启动时激活一次,在应用关闭时正常关闭。 如果在执行后台任务期间引发错误,即使未调用 StopAsync,也应调用 Dispose。
.NET Core 实现后台任务(定时任务)IHostedService(一)的更多相关文章
- ASP.NET Core 使用 Hangfire 定时任务
定时任务组件,除了 Hangfire 外,还有一个 Quarz.NET,不过 Hangfire .NET Core 支持的会更好些. ASP.NET Core 使用 Hangfire 很简单,首先,N ...
- Core开发-后台任务利器Hangfire使用
Core开发-后台任务利器Hangfire使用 ASP.NET Core开发系列之后台任务利器Hangfire 使用. Hangfire 是一款强大的.NET开源后台任务利器,无需Windows服务/ ...
- .NET Core 实现后台任务(定时任务)Longbow.Tasks 组件(三)
原文链接:https://www.cnblogs.com/ysmc/p/16512309.html 在上两篇文章中,简单介绍了怎么使用 IHostedService 与 BackgroundServi ...
- .NET Core 实现后台任务(定时任务)BackgroundService(二)
原文连接:https://www.cnblogs.com/ysmc/p/16468560.html 在上一篇文档中说到使用 IHostedService 接口实现定时任务,其中,有小伙伴就问到,为什么 ...
- 一文说通Dotnet Core的后台任务
这是一文说通系列的第二篇,里面有些内容会用到第一篇中间件的部分概念.如果需要,可以参看第一篇:一文说通Dotnet Core的中间件 一.前言 后台任务在一些特殊的应用场合,有相当的需求. 比方, ...
- ASP.NET Core 开启后台任务
本文告诉大家如何通过 Microsoft.Extensions.Hosting.BackgroundService 开启后台任务 实现 BackManagerService 类继承 Backgroun ...
- ASP.NET Core开发-后台任务利器Hangfire使用
ASP.NET Core开发系列之后台任务利器Hangfire 使用. Hangfire 是一款强大的.NET开源后台任务利器,无需Windows服务/任务计划程序. 可以使用于ASP.NET 应用也 ...
- aspnet core运行后台任务
之前在公司的一个项目中需要用到定时程序,当时使用的是aspnet core提供的IHostedService接口来实现后台定时程序,具体的示例可去官网查看.现在的dotnet core中默认封装了实现 ...
- ASP.NET Core 3.x控制IHostedService启动顺序浅探
想写好中间件,这是基础. 一.前言 今天这个内容,基于于ASP.NET Core 3.x. 从3.x开始,ASP.NET Core使用了通用主机模式.它将WebHostBuilder放到了通用的I ...
随机推荐
- RxJava + Retrofit源码解析
RxJava + Retrofit怎么请求网络,具体的用法这里就不讲了,本文只讲一些重点源码. 版本如下: okhttp : "com.squareup.okhttp3:okhttp:3.1 ...
- 通过配置文件(.htaccess)实现文件上传
一·什么是服务器配置文件.htaccess 许多服务器还允许开发人员在各个目录中创建特殊的配置文件,以便覆盖或添加一个或多个全局设置.例如,Apache 服务器将从一个名为(.htaccess如果存在 ...
- Windows常用cmd命令总结
cmd是command的缩写,即命令提示符. 运行操作: 使用"Win+R"快捷键召唤出运行窗口,再在运行中输入cmd即可. 1.ping 用法: 常用举例: ping www.g ...
- Unity实现简单的对象池
一.简介 先说说为什么要使用对象池 在Unity游戏运行时,经常需要生成一些物体,例如子弹.敌人等.虽然Unity中有Instantiate()方法可以使用,但是在某些情况下并不高效.特别是对于那些需 ...
- Microsoft Graph 的 .NET 6 之旅
这是一篇发布在dotnet 团队博客上由微软Graph首席软件工程师 Joao Paiva写的文章,原文地址: https://devblogs.microsoft.com/dotnet/micros ...
- 图片查看器——viewer.js
使用简介 https://github.com/FNNDSC/viewerjs(需要点击遮罩层关闭弹框的复制下面内容) https://www.jianshu.com/p/d98db3815823 v ...
- xrdp出现xrdp vnc error problem connecting解决办法
# generate a file called .xsession in your home directory, and set default desktop echo "xfce4- ...
- nginx反向代理获取用户真实ip
nginx做反向代理时,默认的配置后端获取到的ip都是来自于nginx,如何转发用户的真实ip到后端程序呢?如是是java后端,用request.getRemoteAddr();获取到的是nginx的 ...
- Hadoop安装学习(第三天)
学习任务: 1.解压jdk和hadoop包 2.安装jdk 3.修改hadoop配置文件 4.hadoop格式化 5.hadoop启动 出现的问题:hadoop可以正常启动,但是端口9000丢失,导致 ...
- Net6 Xunit 集成测试
对于单元测试.集成测试大部分开发的朋友都懒得去写,因为这要耗费精力去设计去开发,做完项目模块直接postman 调用测试(当然这是一个选择,开发也中经常用到),但是如果测试需要多样化数据,各种场景模拟 ...