当前位置: 首页 > article >正文

了解 .NET 8 中的定时任务或后台服务:IHostedService 和 BackgroundService

        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 托管框架提供的其他功能和配置。


http://www.kler.cn/news/366085.html

相关文章:

  • 【elkb】linux麒麟v10安装ELKB 8.8.X版本(ARM架构)
  • ThinkPhp配置中间件解决跨域问题
  • TDengine 签约新奥新智:写入速度提升10倍,成本降低90%
  • LLM | 论文精读 | 基于大型语言模型的自主代理综述
  • 最新版本jdbcutils集成log4j做详细sql日志、自动释放连接...等
  • 软考中级嵌入式系统设计师笔记分享(二)
  • TensorFlow面试整理-TensorFlow 高级功能
  • 八,Linux基础环境搭建(CentOS7)- 安装Mysql和Hive
  • ffmpeg视频滤镜:压缩-deflate
  • Spark实现PageRank算法
  • Java审计对比工具JaVers使用
  • CentOS 7 安装gcc编译环境
  • 解决selenium打开浏览器自动退出
  • k8s 查看 Secrets 的内容和详细信息
  • LCD手机屏幕高精度贴合
  • 密集向量(Dense Vectors):最大化机器学习中数据的潜力
  • 什么是埋点测试,app埋点测试怎么做?
  • 24.10.25 人工智能基础 Pandas库 函数 学习笔记
  • Spring中的循环依赖
  • Android BUG 之 Program type already present: MTT.ThirdAppInfoNew
  • 生信软件39 - GATK最佳实践流程重构,提高17倍分析速度的LUSH流程
  • PyTorch 保存和加载模型状态和优化器状态
  • win10系统家庭版.net framework 3.5sp1启动错误如何解决
  • idea 集成maven
  • Maven(解决思路)
  • TCP标志位在网络故障排查中的作用