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

在 ASP.NET Core 中,如果需要运行长时间运行的后台任务,比如定时处理数据、轮询数据库、发送邮件或维护缓存,IHostedService 是一个非常合适的选择。它允许你在应用启动和关闭时执行自定义逻辑,非常适合托管后台服务。
IHostedService 是一个接口,包含两个方法:
你只需实现这个接口,将你的后台逻辑放入其中,ASP.NET Core 会自动管理它的生命周期。
以一个简单的定时任务为例,每 10 秒打印一条日志。
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System.Threading;
using System.Threading.Tasks;
public class TimedHostedService : IHostedService
{
private readonly ILogger<TimedHostedService> _logger;
private Timer? _timer;
public TimedHostedService(ILogger<TimedHostedService> 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;
}
}
var builder = WebApplication.CreateBuilder(args); // 添加 Hosted Service builder.Services.AddHostedService<TimedHostedService>(); var app = builder.Build(); app.Run();
这样,当应用启动时,StartAsync 被调用,定时器开始工作;关闭时,StopAsync 确保定时器被正确释放。
直接实现 IHostedService 对于复杂任务可能不够方便。ASP.NET Core 提供了抽象类 BackgroundService,更适合长时间运行的任务,比如从队列中消费消息。
本文档主要讲述的是Android服务Service_详解;服务(Service)是Android系统中4个应用程序组件之一(其他的组件详见3.2节的内容)。服务主要用于两个目的:后台运行和跨进程访问。通过启动一个服务,可以在不显示界面的前提下在后台运行指定的任务,这样可以不影响用户做其他事情。通过AIDL服务可以实现不同进程之间的通信,这也是服务的重要用途之一。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
0
using Microsoft.Extensions.Hosting;
using System.Threading.Channels;
public class QueuedHostedService : BackgroundService
{
private readonly ChannelReader<string> _reader;
public QueuedHostedService(Channel<string> 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
基本上就这些。用好 IHostedService,可以让后台任务与应用共存亡,既可靠又易于维护。
以上就是C# IHostedService的用法 - 在ASP.NET Core中运行后台任务的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号