C# .net6使用Hangfire

首先我们先来了解什么是Hangfire?

Hangfire 是一个用于 .NET 的任务调度库,允许你在后台运行任务,而不需要依赖外部的任务队列服务或复杂的基础设施。它简化了后台任务的创建、调度和管理过程,使得在 .NET 应用程序中处理长期运行的任务变得更加容易和可靠。目前1.6+版本已支持.NET Core、.Net 5+。个人认为它最大特点在于内置提供集成化的控制台,方便后台查看及监控。

主要特性

1.简单易用:Hangfire 提供了简单的 API 来创建、调度和管理后台任务。你只需用简单的代码调用 Hangfire 的方法即可创建和管理任务。

2.持久化存储:Hangfire 支持将任务信息存储到多种数据库中,包括 SQL Server、Redis、MongoDB 等。任务的状态、失败记录和其他信息都可以持久化到这些存储中,以便任务可以在系统重启后恢复。

3.任务调度:Hangfire 支持多种调度策略,包括立即执行、延迟执行、重复执行和定时任务等。你可以使用简单的表达式或代码来指定任务的调度规则。

4.任务监控:Hangfire 提供了一个内置的仪表板,用于监控任务的状态、查看任务执行历史、管理失败的任务等。这使得你可以很方便地跟踪任务的执行情况。

5.任务重试:如果任务失败,Hangfire 可以自动重试任务,并且支持自定义重试策略。

6.任务分布式处理:Hangfire 可以在多个服务器或进程之间分配任务,使得任务处理可以横向扩展,从而提高处理能力和可靠性。

应用场景

Hangfire 适用于各种需要后台任务处理的场景,包括但不限于:

定时任务:执行定期的维护任务、生成报告、同步数据等。
异步任务处理:处理用户上传的文件、发送电子邮件、生成复杂的数据处理等。
后台工作:在后台处理长时间运行的任务,而不阻塞用户请求的执行。
任务调度和管理:创建、管理和监控任务,确保任务按照预期的时间和频率执行。

使用Hangfire

本文以.net6示例

安装 Hangfire

控制台安装

Install-Package Hangfire.Core
Install-Package Hangfire.Dashboard.BasicAuthorization
Install-Package Hangfire.HttpJob
Install-Package Hangfire.SqlServer

包管理器安装
在这里插入图片描述

配置Hangfire

Program.cs文件中 添加以下代码

using Hangfire;
using Hangfire.Dashboard.BasicAuthorization;
using Hangfire.SqlServer;


var builder = WebApplication.CreateBuilder(args);
//添加hangfire服务
builder.Services.AddHangfire(configuration => configuration
    .SetDataCompatibilityLevel(CompatibilityLevel.Version_170) // 设置数据兼容性级别为 1.7 版本
    .UseSimpleAssemblyNameTypeSerializer() // 使用简单的程序集名称类型序列化器
    .UseRecommendedSerializerSettings() // 使用推荐的序列化器设置
    .UseSqlServerStorage(builder.Configuration.GetConnectionString("HangfireConnection"), new SqlServerStorageOptions
    {//持久化
        CommandBatchMaxTimeout = TimeSpan.FromMinutes(5), // 批处理作业的最大超时时间为 5 分钟
        SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5), // 作业的可见性超时时间为 5 分钟
        QueuePollInterval = TimeSpan.FromSeconds(5), // 检查作业队列的间隔时间为 5 秒
        JobExpirationCheckInterval = TimeSpan.FromHours(1),//- 作业到期检查间隔(管理过期记录)。默认值为1小时。
        CountersAggregateInterval = TimeSpan.FromMinutes(5),//- 聚合计数器的间隔。默认为5分钟。
        //DashboardJobListLimit=5000,//- 仪表板作业列表限制。默认值为50000。
        TransactionTimeout = TimeSpan.FromMinutes(1),//- 交易超时。默认为1分钟。
        UseRecommendedIsolationLevel = true, // 使用推荐的事务隔离级别
        DisableGlobalLocks = true // 禁用全局锁定机制
    }));

builder.Services.AddHangfireServer(); // 添加 Hangfire 服务器


var app = builder.Build();
//启用仪表盘
app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
    Authorization = new[] {new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions
    {
        RequireSsl = false,       // 是否需要SSL连接,默认为false
        SslRedirect = false,      // 是否启用SSL重定向,默认为false
        LoginCaseSensitive = true, // 登录名是否区分大小写,默认为true
        //Users = new BasicAuthAuthorizationUser[] {},  //未设置登录凭据
        Users = new []
        {
            new BasicAuthAuthorizationUser
            {
                Login = "admin",      // 管理员登录名
                PasswordClear = "123456"  // 管理员密码
            }
        }
    })},
    IsReadOnlyFunc = (context) => false  // 设置仪表盘为可写模式
});

appsettings.json文件中配置链接数据库的信息

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning"
      //"Microsoft.AspNetCore": "Warning",
      //"Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware": "Information"
    }
  },
  "ConnectionStrings": {
    "Default": "Server=127.0.0.1;database=test; Persist Security Info=True;User ID=sa;Password=123;Packet Size=512;Encrypt=True;TrustServerCertificate=True;MultipleActiveResultSets=True",
    "HangfireConnection": "server=127.0.0.1;database=test;uid=sa;pwd=123;TrustServerCertificate=true"
  },
  "AllowedHosts": "*"
}

创建任务调度

Program.cs文件中 添加以下代码。在程序启动前,也就是在app.Run();之前

//RecurringJob.AddOrUpdate("每分钟执行一次", () => Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")), Cron.Minutely());
RecurringJob.AddOrUpdate<IBackgroundAuditTasksService>("review", e => e.BackendReviewAsync(), "*/2 * * * *");//每两分钟执行一次任务
app.Run();

编写任务接口

namespace test.Application.Interface.demo
{
    public interface IBackgroundAuditTasksService
    {
        /// <summary>
        /// 后台审核
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        Task BackendReviewAsync();
    }
}

实现接口

namespace test.Application.ServiceImplementation.demo
{
    public class BackgroundAuditTasksService : IBackgroundAuditTasksService
    {
        private readonly ICache _cache;
        public BackgroundAuditTasksService(
            ICache cache)
        {
            _cache = cache;
        }
        public async Task BackendReviewAsync()
        {
            //throw new NotImplementedException();
            await TestAsync();
        }

        public async Task TestAsync()
        {
            //Do something
        }

    }
}

在程序启动时会自动创建Hangfire数据库
在这里插入图片描述

访问仪表盘

访问 http://ip:port/hangfire 可以查看任务的状态和历史记录等信息。
在这里插入图片描述
在这里插入图片描述

当发布托管到iis可能会遇见Hangfire任务停止的情况,这时候怎么处理呢?可以查看我的另一篇文章https://blog.csdn.net/qq_39569480/article/details/140394221?spm=1001.2014.3001.5502

相关推荐

  1. H3<span style='color:red;'>CNE</span>:FTP

    H3CNE:FTP

    2024-07-13 11:38:03      36 阅读
  2. 【ES6】Promise 使用

    2024-07-13 11:38:03       35 阅读
  3. 6.0 MapReduce 使用

    2024-07-13 11:38:03       30 阅读
  4. vue2使用g6,G6

    2024-07-13 11:38:03       19 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 11:38:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 11:38:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 11:38:03       58 阅读
  4. Python语言-面向对象

    2024-07-13 11:38:03       69 阅读

热门阅读

  1. 【2024暑期实习】接到新需求该如何做?

    2024-07-13 11:38:03       23 阅读
  2. MATLAB中Simulink.exportToTemplate用法

    2024-07-13 11:38:03       23 阅读
  3. C#面:中间件的使用场景有哪些?

    2024-07-13 11:38:03       21 阅读
  4. vue3 学习笔记08 -- computed 和 watch

    2024-07-13 11:38:03       24 阅读
  5. R语言学习笔记6-数据框

    2024-07-13 11:38:03       20 阅读
  6. 菜鸡的原地踏步史07(◐‿◑)

    2024-07-13 11:38:03       18 阅读
  7. C++ 基础练习 - 第一章(英文版)

    2024-07-13 11:38:03       19 阅读
  8. 深入解析BeautifulSoup:Python网页抓取的瑞士军刀

    2024-07-13 11:38:03       21 阅读
  9. Sentinel和hystric的运用详解

    2024-07-13 11:38:03       22 阅读
  10. 如何让代码添加的控件显示出来

    2024-07-13 11:38:03       19 阅读