当前位置: 首页 > news >正文

ASP.NET Core托管服务

目录

托管服务的异常问题

托管服务中使用DI

托管服务案例:数据的定时导出


场景,代码运行在后台。比如服务器启动的时候在后台预先加载数据到缓存,每天凌晨3点把数据导出到备份数据库,每隔5秒钟在两张表之间同步一次数据。托管服务实现IHostedService接口,一般编写从BackgroundService继承的类。如需定时操作,可使用Hangfire框架。

builder.Services.AddHostedService<HostedService>();

托管服务的异常问题

  1. 从.NET 6开始,当托管服务中发生未处理异常的时候,程序就会自动停止并退出。可以把HostOptions.BackgroundServiceExceptionBehavior设置为Ignore,程序会忽略异常,而不是停止程序。不过推荐采用默认的设置,因为“异常应该被妥善的处理,而不是被忽略”。
  2. 要在ExecuteAsync方法中把代码用try……catch包裹起来,当发生异常的时候,记录日志中或发警报等。

托管服务中使用DI

  1. 托管服务是以单例的生命周期注册到依赖注入容器中的。因此不能注入生命周期为范围或者瞬态的服务。比如注入EF Core的上下文的话,程序就会抛出异常。
  2. 可以通过构造方法注入一个IServiceScopeFactory服务,它可以用来创建一个IServiceScope对象,这样我们就可以通过IServiceScope来创建短生命周期的服务了。记得在Dispose中释放IServiceScope。
public class HostedService : BackgroundService
{private IServiceScope serviceScope;public HostedService(IServiceScopeFactory serviceScopeFactory){this.serviceScope = serviceScopeFactory.CreateScope();}public override void Dispose(){this.serviceScope.Dispose();base.Dispose();}protected override async Task ExecuteAsync(CancellationToken stoppingToken){try{var testService = serviceScope.ServiceProvider.GetRequiredService<TestService>();Console.WriteLine("HostService1启动" + testService.Add(1, 1));await Task.Delay(3000);string txt = await File.ReadAllTextAsync("f:/1.txt");Console.WriteLine("文件读取完成");string s = null;s.ToString();await Task.Delay(3000);Console.WriteLine(txt);}catch (Exception ex){Console.WriteLine("服务中出现未处理异常" + ex);}}
}
public class TestService
{public int Add(int a, int b){return a + b;}
}
builder.Services.AddHostedService<HostedService>();
builder.Services.AddScoped<TestService>();

托管服务案例:数据的定时导出

常驻后台的托管服务并不需要特殊的技术,我们只要让ExecuteAsync中的代码一直执行不结束就行了。实现的功能就是每隔五秒钟统计一次数据库中的数据,将数据写入文本。

builder.Services.AddHostedService<ScheduledService>();public class ScheduledService : BackgroundService
{private readonly IServiceScope serviceScope;public ScheduledService(IServiceScopeFactory serviceScopeFactory){this.serviceScope = serviceScopeFactory.CreateScope();}public override void Dispose(){this.serviceScope.Dispose();base.Dispose();}protected override async Task ExecuteAsync(CancellationToken stoppingToken){try{var dbCtx = serviceScope.ServiceProvider.GetRequiredService<MyDbContext>();while (!stoppingToken.IsCancellationRequested){var count = dbCtx.Users.LongCount();await File.WriteAllTextAsync("F:/1.txt", count.ToString());await Task.Delay(5000);}Console.WriteLine("导出成功" + DateTime.Now);}catch (Exception ex){Console.WriteLine(ex);}}
}
http://www.lryc.cn/news/534304.html

相关文章:

  • HarmonyOS 5.0应用开发——全局自定义弹出框openCustomDialog
  • 如何在C++ QT 程序中集成cef3开源浏览器组件去显示网页?
  • 深入讲解MyBatis
  • 使用matlab 对传递函数分析bode图和阶跃函数
  • 2025牛客寒假算法基础集训营5(补题)
  • FaceFusion如何设置公开链接和端口
  • 神经网络常见激活函数 6-RReLU函数
  • 计算机网络面经
  • Qt:常用控件
  • 算法设计-找第二大数(C++)
  • 【C++高并发服务器WebServer】-14:Select详解及实现
  • redis项目
  • Spring统一修改RequestBody
  • NCV4275CDT50RKG 车规级LDO线性电压调节器芯片——专为新能源汽车设计的高可靠性电源解决方案
  • 前端开发架构师Prompt指令的最佳实践
  • 【AI实践】Windsurf AI编程voice对话应用
  • 【自学笔记】文言一心的基础知识点总览-持续更新
  • kafka消费端之消费者协调器和组协调器
  • 线上hbase rs 读写请求个数指标重置问题分析
  • DeepSeek-R1 本地电脑部署 Windows系统 【轻松简易】
  • 数据库,数据表的增删改查操作
  • VUE 集成企微机器人通知
  • 《Java核心技术 卷II》Java平台的脚本机制
  • Ollama + AnythingLLM + Deepseek r1 实现本地知识库
  • 记录 | WPF基础学习Style局部和全局调用
  • PromptSource安装报错
  • Leetcode 3448. Count Substrings Divisible By Last Digit
  • Maven 下载与配置教程:附百度网盘地址
  • 基于 GEE 的网格化降雨数据可视化与时间序列分析
  • java-初识List