在当今快节奏的现代 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
在配置应用程序的请求处理管道之前: 这意味着数据预加载操作将在应用程序开始处理传入的 HTTP 请求之前完成。
在服务器完全启动并准备好接受 HTTP 请求之前: 这可确保应用程序在完全准备好之前不会开始接受请求,包括预加载任何必要的数据。
当您的应用程序需要执行关键启动任务时,此设置特别有用,这些任务必须在应用程序可用于处理请求之前完成,从而确保平稳高效的启动过程。
调用 StopAsync 时
Application Shutdown: 在应用程序关闭过程中调用,可以通过 Linux 中的 SIGINT/SIGTERM 信号、控制台中的 Ctrl+C 或 IIS 中的停止应用程序来触发。StopAsync
执行顺序: 请务必注意,这是在服务器停止接受新请求后调用的。这意味着在关闭期间,您的后台任务不会被新的传入 HTTP 请求中断。StopAsync
超时: ASP.NET Core 在应用程序完全关闭之前等待方法完成。但是,有一个默认超时 (宽限期),超过此时间后,即使尚未完成,应用程序也会强制关闭。可以在 Host Builder 配置中配置此超时。StopAsyncStopAsync
IHostedService 与 BackgroundService
IHostedService和 ASP.NET Core 的用途相似,但在抽象级别和实现后台任务的易用性方面有所不同。BackgroundService
IHostedService
低级抽象: 直接实现使您可以更好地控制后台任务的 start 和 stop 方法。您需要显式实现 and 方法。IHostedServiceStartAsync(CancellationToken)StopAsync(CancellationToken)
灵活性: 它更灵活,允许更广泛的后台任务实现,而不必绑定到长时间运行的循环。
后台服务
High-Level Abstraction: 是一个抽象类,用于实现并提供专门用于创建长时间运行的后台任务的更高级别抽象。BackgroundServiceIHostedService
简化实施: 它为后台任务的逻辑提供了模板方法,从而简化了重复和长时间运行的任务的实现。ExecuteAsync(CancellationToken)
自动处理启动/停止: 使用 ,您只需覆盖任务逻辑。and 方法由基类处理,该基类为您调用和管理取消标记。BackgroundServiceExecuteAsync(CancellationToken)StartAsyncStopAsyncExecuteAsync
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);
}
}
}
当您需要完全控制服务的生命周期或您的后台任务不适合长时间运行的循环模型时**,请使用**此函数。IHostedService
用于适合循环模型的长时间运行的后台任务,因为它简化了安全启动、执行和停止任务所需的大部分样板代码。BackgroundService
每 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 应用程序开发人员都至关重要。
如果你喜欢我的文章,请给我一个赞!谢谢