IHostedService是ASP.NET Core中用于托管长时间运行后台任务的接口,含StartAsync(启动时执行)和StopAsync(关闭时优雅停止)方法;可通过实现该接口或继承BackgroundService(提供ExecuteAsync抽象方法)来创建定时任务、消息队列处理等服务,并需用AddHostedService注册以确保生命周期由主机管理。

在 ASP.NET Core 中,如果需要运行长时间运行的后台任务,比如定时处理数据、轮询数据库、发送邮件或维护缓存,IHostedService 是一个非常合适的选择。它允许你在应用启动和关闭时执行自定义逻辑,非常适合托管后台服务。
什么是 IHostedService?
IHostedService 是一个接口,包含两个方法:
StartAsync(CancellationToken cancellationToken):在应用启动后调用,用于开始后台任务。 StopAsync(CancellationToken cancellationToken):在应用关闭时调用,用于优雅地停止任务。
你只需实现这个接口,将你的后台逻辑放入其中,ASP.NET Core 会自动管理它的生命周期。
如何使用 IHostedService?
以一个简单的定时任务为例,每 10 秒打印一条日志。
创建一个类实现 IHostedService:
using Microsoft.Extensions.Hosting;using Microsoft.Extensions.Logging;using System.Threading;using System.Threading.Tasks;public class TimedHostedService : IHostedService{ private readonly ILogger _logger; private Timer? _timer; public TimedHostedService(ILogger logger) { _logger = logger; } public Task StartAsync(CancellationToken cancellationToken) { _logger.LogInformation("Timed Hosted Service is starting."); _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); return Task.CompletedTask; } private void DoWork(object? state) { if (!_timer!.Disposed) { _logger.LogInformation("Timed Hosted Service is working. Time: {Time}", DateTime.Now); } } public Task StopAsync(CancellationToken cancellationToken) { _logger.LogInformation("Timed Hosted Service is stopping."); _timer?.Change(Timeout.Infinite, 0); return Task.CompletedTask; }}
在 Program.cs 中注册服务:
var builder = WebApplication.CreateBuilder(args);// 添加 Hosted Servicebuilder.Services.AddHostedService();var app = builder.Build();app.Run();
这样,当应用启动时,StartAsync 被调用,定时器开始工作;关闭时,StopAsync 确保定时器被正确释放。
更复杂的场景:使用 BackgroundService
直接实现 IHostedService 对于复杂任务可能不够方便。ASP.NET Core 提供了抽象类 BackgroundService,更适合长时间运行的任务,比如从队列中消费消息。
using Microsoft.Extensions.Hosting;using System.Threading.Channels;public class QueuedHostedService : BackgroundService{ private readonly ChannelReader _reader; public QueuedHostedService(Channel channel) { _reader = channel.Reader; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { await foreach (var message in _reader.ReadAllAsync(stoppingToken)) { Console.WriteLine($"Processing message: {message}"); await Task.Delay(1000, stoppingToken); // 模拟处理耗时 } }}
BackgroundService 内部实现了 IHostedService,并提供了一个抽象的 ExecuteAsync 方法,你可以在这里写主循环逻辑,避免手动管理 CancellationToken 和循环。
注册和依赖注入
所有实现 IHostedService 或继承 BackgroundService 的类都会被当作单例处理。它们可以在构造函数中注入任何已注册的服务,如 ILogger、DbContext 或自定义服务。
确保在 builder.Services 中使用 AddHostedService() 注册,而不是普通的 AddSingleton,这样才能由主机正确管理生命周期。
基本上就这些。用好 IHostedService,可以让后台任务与应用共存亡,既可靠又易于维护。
以上就是C# IHostedService的用法 – 在ASP.NET Core中运行后台任务的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1442672.html
微信扫一扫
支付宝扫一扫