架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1500|回复: 4

[资料] ASP.NET Core(十九)使用 BackgroundService 运行后台任务

[复制链接]
发表于 2023-5-20 22:51:51 | 显示全部楼层 |阅读模式
需求:项目中定义了一个静态的日志队列,每次请求都有可能往队列里放入消息,我们需要网站开启有一个后台任务来处理这个队列里面的消息。

回顾:

基于 .NET Core 在 Linux 下的服务
https://www.itsvse.com/thread-9447-1-1.html
IHostedService 接口

IHostedService 接口为主机托管的对象定义了两种方法:

StartAsync(CancellationToken):用于启动后台任务的逻辑。
StopAsync(CancellationToken):在主机执行正常关闭时触发,包含结束后台任务的逻辑。

BackgroundService 基类

BackgroundService 是用于实现长时间运行的 IHostedService 的基类,源码地址:https://source.dot.net/#Microsoft.Extensions.Hosting.Abstractions/BackgroundService.cs

QQ截图20230520223934.jpg

调用 ExecuteAsync(CancellationToken) 来运行后台服务。 实现返回一个 Task,其表示后台服务的整个生存期。 在 ExecuteAsync 变为异步(例如通过调用 await)之前,不会启动任何其他服务。 避免在 ExecuteAsync 中执行长时间的阻塞初始化工作。 StopAsync(CancellationToken) 中的主机块等待完成 ExecuteAsync。

我们实现一个循环打印日志的后台任务,代码如下:

在 service 服务中进行注册,代码如下:

注册模式为单例,如下图:

QQ截图20230520224426.jpg

启动项目,输出如下:

work.gif

在后台任务中使用有作用域的服务

要在 BackgroundService 中使用有作用域的服务,请创建作用域。 默认情况下,不会为托管服务创建作用域。如果直接使用构造函数注入作用域的对象,报错如下:

Unhandled exception. System.AggregateException: Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: Microsoft.Extensions.Hosting.IHostedService Lifetime: Singleton ImplementationType: WebApplication2.Worker.TestServiceHostedService': Cannot consume scoped service 'WebApplication2.Worker.User' from singleton 'Microsoft.Extensions.Hosting.IHostedService'.)
我们需要修改代码如下:

参考:https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/host/hosted-services

(完)





上一篇:【转】OData – OData vs GraphQL
下一篇:.NET 之嵌入式数据库 LiteDB 教程
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2023-5-20 22:52:45 | 显示全部楼层


回顾

ASP.NET Core(十八)自定义简单的 OutputCache 输出缓存
https://www.itsvse.com/thread-10583-1-1.html

ASP.NET Core(十七)集成 MiniProfile 应用性能分析
https://www.itsvse.com/thread-10571-1-1.html

ASP.NET Core(十六)依赖注入之动态注册服务
https://www.itsvse.com/thread-10560-1-1.html

ASP.NET Core(十五)使用 HttpClient 发送 HTTP 请求
https://www.itsvse.com/thread-10311-1-1.html

ASP.NET Core(十四)基于 SkiaSharp 图片验证码
https://www.itsvse.com/thread-10287-1-1.html

ASP.NET Core(十三)判断是否是 Ajax 请求
https://www.itsvse.com/thread-10284-1-1.html

ASP.NET Core(十二)前端 JS、CSS 捆绑和压缩
https://www.itsvse.com/thread-10282-1-1.html

ASP.NET Core(十一)端点路由添加中间件显示所有 DI 服务
https://www.itsvse.com/thread-10269-1-1.html

ASP.NET Core(十)Configuration 配置优先级详解
https://www.itsvse.com/thread-10265-1-1.html

ASP.NET Core(九) 之 Middleware 中间件详解
https://www.itsvse.com/thread-9647-1-1.html

ASP.NET Core 中间件(Middleware)详解
https://www.itsvse.com/thread-8126-1-1.html

ASP.NET Core(八) 之 Swagger UI 默认参数的坑
https://www.itsvse.com/thread-9640-1-1.html

ASP.NET Core(七)深入刨析框架源码
https://www.itsvse.com/thread-9601-1-1.html

ASP.NET Core(六)DI 手动获取注入对象的方法
https://www.itsvse.com/thread-9595-1-1.html

ASP.NET Core(五)基于 CAP 分布式事务
https://www.itsvse.com/thread-9593-1-1.html

ASP.NET Core(四)之过滤器统一 ModelState 模型验证
https://www.itsvse.com/thread-9589-1-1.html

ASP.NET Core(三)使用 ActivatorUtilities 动态创建实例
https://www.itsvse.com/thread-9488-1-1.html

ASP.NET Core(二)通过代码自重启应用
https://www.itsvse.com/thread-9480-1-1.html

ASP.NET Core(一)使用 Redis 缓存
https://www.itsvse.com/thread-9393-1-1.html
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2023-5-29 20:29:45 | 显示全部楼层
可以将 IServiceProvider  换成 IServiceScopeFactory,两者在创建 CreateScope 并没有区别。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2023-8-2 19:13:00 | 显示全部楼层
.NET 6 中新的计时器 PeriodicTimer 使用
https://www.itsvse.com/thread-10637-1-1.html
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2023-8-13 20:13:37 | 显示全部楼层
StartAsync 应仅限于短期任务,因为托管服务是按顺序运行的,在 StartAsync 运行完成之前不会启动其他服务长期任务应放置在 ExecuteAsync 中

参考:https://github.com/dotnet/runtime/blob/main/src/libraries/Microsoft.Extensions.Hosting.Abstractions/src/BackgroundService.cs

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-20 20:20

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表