IHostedService 是一个 .NET Core 接口,用于定义一个长时间运行的服务,可以在 ASP.NET Core 应用程序中使用。它提供了两个方法:
-
StartAsync:在应用程序启动时调用,用于启动服务。
-
StopAsync:在应用程序关闭时调用,用于停止服务。
IHostedService 接口可以用于实现各种后台任务,例如:
-
定时任务:使用 Timer 或 CancellationTokenSource 和 Task.Delay 实现。
-
后台处理任务:使用 Task.Run 在后台线程中执行长时间运行的代码。
-
后台队列任务:使用消息队列实现后台任务的处理。
使用 IHostedService 接口的好处是可以很容易地将后台任务集成到 ASP.NET Core 应用程序中,同时也可以很容易地控制后台任务的启动和停止。
using Microsoft.Extensions.Hosting;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Authorization.WebApi
{
/// <summary>
/// 官方介绍主要是用来实现实现后台任务
/// </summary>
public class BackgroundService : IHostedService, IDisposable
{
private readonly ILogger _logger;
private readonly CancellationTokenSource _cts = new CancellationTokenSource();
/// <summary>
/// 构造函数
/// </summary>
/// <param name="logger"></param>
public WpBackgroundService(ILogger logger)
{
_logger = logger;
}
/// <summary>
/// 服务开始执行的代码
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task StartAsync(CancellationToken cancellationToken)
{
_ = DoWorkAsync();
await Task.CompletedTask;
}
/// <summary>
/// 业务逻辑
/// </summary>
/// <returns></returns>
private async Task DoWorkAsync()
{
await Task.Run(async () =>
{
while (!_cts.IsCancellationRequested)
{
Console.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss}");
await Task.Delay(TimeSpan.FromSeconds(5), _cts.Token);
}
}, _cts.Token);
}
/// <summary>
/// 停止
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task StopAsync(CancellationToken cancellationToken)
{
_cts.Cancel();
await Task.CompletedTask;
}
/// <summary>
/// 释放
/// </summary>
public void Dispose()
{
_cts.Dispose();
}
}
}
-
在后台任务类中创建一个 CancellationTokenSource 对象,用于取消后台任务。
-
在后台任务中使用无限循环,直到 CancellationTokenSource 对象被取消。
-
在循环中使用 Task.Delay 方法来等待一定时间间隔,并检查 CancellationTokenSource 是否已被取消。