Skip to content

Understanding Background Services in .NET 8 IHostedService and BackgroundService - DEV Community

Published: at 12:00 AM

理解.NET 8中的后台服务:IHostedService和BackgroundService - DEV社区

摘要

.NET 8引入了强大的功能,用于通过IHostedService和…


.NET 8引入了强大的功能,用于通过IHostedServiceBackgroundService管理后台任务。这些服务使得长时间运行的操作(如定时任务、后台处理和周期性维护任务)能够无缝集成到你的应用程序中。本文探讨了这些新功能,并提供了实际示例帮助你快速入门。你可以在我的GitHub 仓库找到这些示例的源代码。

什么是后台服务?

.NET中的后台服务允许你在独立于主应用程序线程的情况下运行任务。这对于那些需要持续运行或定期运行但不阻塞主应用程序流程的任务非常重要。

IHostedService接口

IHostedService接口定义了两个方法:

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

BackgroundService类是一个抽象基类,简化了后台任务的实现。它提供了单个方法供重写:

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();
    }
}

主要区别

结论

.NET 8的后台服务通过IHostedServiceBackgroundService提供了一种强大且灵活的管理后台任务的方法。通过根据需求选择合适的抽象层,你可以高效地在你的应用程序中实现和管理长时间运行的操作。这些新特性增强了创建响应性、可扩展和可维护的.NET应用程序的能力。