IHostedService.NET 8 引入了使用和管理后台任务的强大功能BackgroundService。这些服务使长时间运行的操作(例如计划任务、后台处理和定期维护任务)可以无缝集成到您的应用程序中。本文探讨了这些新功能,并提供了实际示例来帮助您入门。您可以在我的GitHub 存储库中找到这些示例的源代码。
什么是后台服务?
.NET 中的后台服务允许您独立于主应用程序线程在后台运行任务。这对于需要连续或定期运行且不会阻塞主应用程序流程的任务至关重要。
IHostedService 接口
该IHostedService接口定义了两种方法:
StartAsync(CancellationToken cancellationToken):应用程序主机启动时调用。
StopAsync(CancellationToken cancellationToken):当应用程序主机正在执行正常关闭时调用。
IHostedService 实现示例:
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
public class TimedHostedService : IHostedService, IDisposable
{
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 running.");
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
return Task.CompletedTask;
}
private void DoWork(object state)
{
_logger.LogInformation("Timed Hosted Service is working.");
}
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Timed Hosted Service is stopping.");
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
}
BackgroundService Class
该类BackgroundService是一个抽象基类,可简化后台任务的实现。它提供了一个方法来重写:
ExecuteAsync(CancellationToken stoppingToken):包含后台任务的逻辑并运行直到应用程序关闭。
BackgroundService 实现示例:
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
public class TimedBackgroundService : BackgroundService
{
private readonly ILogger<TimedBackgroundService> _logger;
public TimedBackgroundService(ILogger<TimedBackgroundService> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("Timed Background Service running.");
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Timed Background Service is working.");
await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken);
}
_logger.LogInformation("Timed Background Service is stopping.");
}
}
实际用途:
要在您的 .NET 应用程序中使用这些后台服务,您需要在依赖注入容器中注册它们。这可以在文件中完成Program.cs。
注册托管服务:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Threading.Tasks;
public class Program
{
public static async Task Main(string[] args)
{
var host = Host.CreateDefaultBuilder(args)
.ConfigureServices(services =>
{
services.AddHostedService<TimedHostedService>();
services.AddHostedService<TimedBackgroundService>();
})
.Build();
await host.RunAsync();
}
}
主要区别
抽象级别:
IHostedService:需要手动执行启动和停止逻辑。
BackgroundService:通过提供一个具有单一方法来重写基类来简化实现。
用例:
IHostedService:适用于需要对服务生命周期进行细粒度控制的更复杂的场景。
BackgroundService:非常适合那些可以从减少样板代码中受益的更简单、长时间运行的任务。
结论
.NET 8 的后台服务通过IHostedService和BackgroundService提供了一种强大而灵活的方式来管理后台任务。通过根据您的需求选择适当的抽象,您可以有效地实现和管理应用程序中的长期运行操作。这些新功能增强了创建响应迅速、可扩展且可维护的 .NET 应用程序的能力。
本文提供了开始将后台服务集成到 .NET 应用程序中所需的基础。对于更复杂的场景,请考虑探索 .NET 托管框架提供的其他功能和配置。