在当今快节奏的现代 Web 应用程序中,某些操作必须独立于用户请求运行,以保持效率和可靠性。这些后台任务的范围从日常数据库维护到发送电子邮件或处理队列。例如,电子商务平台可能需要定期更新库存水平、生成报告或管理用户通知,而不会影响主应用程序的响应能力。
考虑一个医疗保健服务的在线预订系统。系统必须管理各种后台任务,例如发送预约提醒、处理账单信息和生成每日使用情况报告。通过使用 ASP.NET Core 中的托管服务,可以有效地管理这些任务,确保应用程序保持响应性和以用户为中心,同时保持关键的后端操作。
要在 ASP.NET Core 应用程序中处理这些要求,开发人员可以使用托管服务实现后台任务。这涉及创建一个继承自 or 的类,提供一种结构化且可靠的方法来管理后台操作。BackgroundServiceIHostedService
在 ASP.NET Core 中实现后台任务
首先,让我们了解一下 Operate 的工作原理并创建一个实际示例。我们将实现一个后台服务,该服务在 ASP.NET Core 应用程序开始处理 HTTP 请求并且服务器完全启动之前执行初始设置任务。在此示例中,我们将基本数据预加载到内存中,并在配置应用程序的请求处理管道和服务器开始接受请求之前记录一条消息,指示 readiness 。IHostedService
步骤 1:实现 IHostedService
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Threading;
using System.Threading.Tasks;
public class DataPreloadService : IHostedService
{
private readonly ILogger<DataPreloadService> _logger;
public DataPreloadService(ILogger<DataPreloadService> logger)
{
_logger = logger;
}
public async Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Data Preload Service is starting.");
// Simulate data loading with a delay
await Task.Delay(2000, cancellationToken); // Simulate some data loading delay
// Log that data loading is complete
_logger.LogInformation("Data Preload Service has finished loading data.");
}
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Data Preload Service is stopping.");
return Task.CompletedTask;
}
}
步骤 2:在 Startup.cs 中注册服务
在您的文件中,向应用程序的服务容器注册 ,以确保它与应用程序一起启动。Startup.csDataPreloadService
public void ConfigureServices(IServiceCollection services)
{
services.AddHostedService<DataPreloadService>();
// Add other services like MVC, Razor Pages, SignalR, etc.
}
解释
在此示例中,实现并使用其方法来模拟需要 2 秒的数据预加载操作。此操作表示您可能需要的任何初始设置任务,例如将配置数据加载到内存中、预热缓存或准备与外部服务的连接。DataPreloadServiceIHostedServiceStartAsync
通过注册 ,我们确保 被调用:DataPreloadServiceConfigureServicesStartAsync
当您的应用程序需要执行关键启动任务时,此设置特别有用,这些任务必须在应用程序可用于处理请求之前完成,从而确保平稳高效的启动过程。
调用 StopAsync 时
IHostedService 与 BackgroundService
IHostedService和 ASP.NET Core 的用途相似,但在抽象级别和实现后台任务的易用性方面有所不同。BackgroundService
IHostedService
后台服务
public class DirectHostedService : IHostedService
{
private readonly ILogger<DirectHostedService> _logger;
public DirectHostedService(ILogger<DirectHostedService> logger)
{
_logger = logger;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Direct Hosted Service starting.");
// Start your task here
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Direct Hosted Service stopping.");
// Stop your task here
return Task.CompletedTask;
}
}
public class MyBackgroundService : BackgroundService
{
private readonly ILogger<MyBackgroundService> _logger;
public MyBackgroundService(ILogger<MyBackgroundService> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("My Background Service is running.");
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("My Background Service is doing work.");
await Task.Delay(1000, stoppingToken);
}
}
}
每 10 分钟运行一次后台服务
要每 10 分钟运行一次后台服务,您可以使用该类。以下是实现和配置它的方法:BackgroundService
步骤 1:实现后台服务
创建一个继承自并覆盖该方法的新类,以每 10 分钟运行一次任务。TimedHostedServiceBackgroundServiceExecuteAsync
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Threading;
using System.Threading.Tasks;
public class TimedHostedService : BackgroundService
{
private readonly ILogger<TimedHostedService> _logger;
private readonly TimeSpan _interval = TimeSpan.FromMinutes(10);
public TimedHostedService(ILogger<TimedHostedService> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Timed Background Service is working.");
// Perform the background task here
await DoWork(stoppingToken);
_logger.LogInformation("Timed Background Service is waiting for the next interval.");
await Task.Delay(_interval, stoppingToken);
}
使用托管服务在 ASP.NET Core 中实现后台任务是一种强大的技术,可确保您的应用程序保持高效、响应迅速且可靠。无论您是处理日常维护、处理用户通知还是管理复杂任务,了解如何利用 对于任何现代 Web 应用程序开发人员都至关重要。