• .Net 5 实现后台定时任务


      对于这个问题可以分为两步来实现,首先如何实现后台任务呢?答案是:IHostedService(了解更多传送门

      IHostedService这个接口只包含两个成员方法:Task StartAsync(CancellationToken cancellationToken); Task StopAsync(CancellationToken cancellationToken);

      即应用程序启动时调用StartAsync方法开启服务,应用程序关闭时停止调用StopAsync服务

      然后是如何实现定时调度呢? 方法有很多,就简单有效的办法就是Timer,干净利落且有效。下面奉上源码:

     1     public abstract class ScheduledService : IHostedService, IDisposable
     2     {
     3         private readonly Timer _timer;
     4         private readonly TimeSpan _period;
     5         protected readonly ILogger Logger;
     6         protected ScheduledService(TimeSpan period, ILogger logger)
     7         {
     8             Logger = logger;
     9             _period = period;
    10             _timer = new Timer(Execute, null, Timeout.Infinite, 0);
    11         }
    12         public void Execute(object state = null)
    13         {
    14             try
    15             {
    16                 Logger.LogInformation("Begin ScheduledService service");
    17                 ExecuteAsync().Wait();
    18             }
    19             catch (Exception ex)
    20             {
    21                 Logger.LogError(ex, "ScheduledService Exception");
    22             }
    23             finally
    24             {
    25                 Logger.LogInformation("ScheduledService finished");
    26             }
    27         }
    28         protected abstract Task ExecuteAsync();
    29         public virtual void Dispose()
    30         {
    31             _timer?.Dispose();
    32             GC.SuppressFinalize(this);
    33         }
    34 
    35         public Task StartAsync(CancellationToken cancellationToken)
    36         {
    37             Logger.LogInformation("Service is starting.");
    38             _timer.Change(TimeSpan.FromSeconds(10), _period);
    39             return Task.CompletedTask;
    40         }
    41         public Task StopAsync(CancellationToken cancellationToken)
    42         {
    43             Logger.LogInformation("Service is stopping.");
    44             _timer?.Change(Timeout.Infinite, 0);
    45             return Task.CompletedTask;
    46         }
    47     }

    如何使用呢:定义ClearDatedFiles 类并重写ExecuteAsync方法来实现你的具体业务代码

     1     public class ClearDatedFiles : ScheduledService
     2     {
     3         private readonly IServiceProvider _serviceProvider;
     4         /// <summary>
     5         /// 每10分钟执行一次
     6         /// </summary>
     7         /// <param name="logger"></param>
     8         public ClearDatedFiles(ILogger<ClearDatedFiles> logger) : base(TimeSpan.FromMinutes(10), logger)
     9         {
    10             _serviceProvider = InternalApp.ServicesProvider;
    11         }
    12         /// <summary>
    13         /// 定时任务
    14         /// </summary>
    15         /// <returns></returns>
    16         protected override Task ExecuteAsync()
    17         {
    18             var service = (IClearDatedFilesService)(_serviceProvider.GetService(typeof(IClearDatedFilesService)));//IOC实例化实体
    19             return service.ClearDatedFiles();//执行任务
    20         }
    21     }

    然后在Startup中注入使用:services.AddHostedService<ClearDatedFiles>();

    作者:听枫xl
    本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    AxInterop.VPIClient DLL注册
    多个事务同时操作数据库
    aspx小试
    WPF 或得PNG图片的外形Path的Data
    Spass导出数据
    Excel VBA小试
    合并Excel文件
    asp.net 中文编码问题
    Delphi中的容器类(3)
    Delphi中的容器类(1)
  • 原文地址:https://www.cnblogs.com/xl-tf/p/14528845.html
Copyright © 2020-2023  润新知