.NET Core 实现后台任务(定时任务)IHostedService(一)

打印 上一主题 下一主题

主题 890|帖子 890|积分 2670

原文链接:https://www.cnblogs.com/ysmc/p/16456787.html
  最近有小伙伴问道,在 .Net Core 中,如何定时执行任务,而因为需要执行的任务比较简单,并不想使用其它的中间件(如 Quartz 等等),在这样的需求下,我给大家介绍一下.Net 内置的后台任务 IHostedService。

  贯彻本人的习惯,不废话,直接上代码,首先我们创建一个类,该类继承 IHostedService 接口,并实现该接口成员,同时我用到了 .NET内置的定时器类 Timer,具体这个 Timer 是什么,我这里就不介绍了,有兴趣的小伙伴可以到官方文档了解 传送门
  在不需要定时执行任务的时候,也可以在这里进行应用启动后的操作,例如创建 RabbitMQ 连接【手动狗头】
  同时,我们需要在 Program.cs(.Net 5 及一下在 Startup.cs)中添加以下配置。
  1. // .Net 6
  2. builder.Services.AddHostedService<TestHostedService>();
  3. // .Net  5 及以下
  4. services.AddHostedService<TestHostedService>();
复制代码
  1. 1 public class TestHostedService : IHostedService, IDisposable
  2. 2 {
  3. 3     private Timer? _timer;
  4. 4
  5. 5     public Task StartAsync(CancellationToken cancellationToken)
  6. 6     {
  7. 7         _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
  8. 8
  9. 9         return Task.CompletedTask;
  10. 10     }
  11. 11
  12. 12     private void DoWork(object? state)
  13. 13     {
  14. 14         Console.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss}");
  15. 15     }
  16. 16
  17. 17     public Task StopAsync(CancellationToken cancellationToken)
  18. 18     {
  19. 19         Console.WriteLine("StopAsync");
  20. 20
  21. 21         return Task.CompletedTask;
  22. 22     }
  23. 23
  24. 24
  25. 25     public void Dispose()
  26. 26     {
  27. 27         _timer?.Dispose();
  28. 28     }        
  29. 29 }
复制代码
  上面的代码非常简单,应用在运行后,会去执行 StartAsync 函数,应用关闭执行 StopAsync,由于我在这里使用的定时器,所以每过5秒都会执行一次 DoWork 函数,以下是运行效果

 
   需要注意的是,这里的定时是不等待任务执行完成,只要时间一到,就会调用 DoWork 函数,所以适合一些简单、特定的场景,后续我将针对这些问题多写几个文档,大佬们有什么建议尽管提,加油!
以下为官方文档对 IHostedService 接口 的说明
 
IHostedService 接口

IHostedService 接口为主机托管的对象定义了两种方法:

  • StartAsync(CancellationToken)
  • StopAsync(CancellationToken)
StartAsync

StartAsync(CancellationToken) 包含用于启动后台任务的逻辑。 在以下操作之前调用 StartAsync:

  • 已配置应用的请求处理管道。
  • 已启动服务器且已触发 IApplicationLifetime.ApplicationStarted。
StartAsync 应仅限于短期任务,因为托管服务是按顺序运行的,在 StartAsync 运行完成之前不会启动其他服务。
StopAsync


  • StopAsync(CancellationToken) 在主机执行正常关闭时触发。 StopAsync 包含结束后台任务的逻辑。 实现 IDisposable 和终结器(析构函数)以处置任何非托管资源。
默认情况下,取消令牌会有五秒超时,以指示关闭进程不再正常。 在令牌上请求取消时:

  • 应中止应用正在执行的任何剩余后台操作。
  • StopAsync 中调用的任何方法都应及时返回。
但是,在请求取消后,将不会放弃任务,调用方会等待所有任务完成。
如果应用意外关闭(例如,应用的进程失败),则可能不会调用 StopAsync。 因此,在 StopAsync 中执行的任何方法或操作都可能不会发生。
若要延长默认值为 5 秒的关闭超时值,请设置:

  • ShutdownTimeout(当使用通用主机时)。
  • 使用 Web 主机时为关闭超时值主机配置设置。
托管服务在应用启动时激活一次,在应用关闭时正常关闭。 如果在执行后台任务期间引发错误,即使未调用 StopAsync,也应调用 Dispose。
 
写在最后

Bootstrap Blazor 官网地址:https://www.blazor.zone
  希望大佬们看到这篇文章,能给项目点个star支持下,感谢各位!
star流程:
1、访问点击项目链接:BootstrapBlazor   
2、点击star,如下图,即可完成star,关注项目不迷路:

 
另外还有两个GVP项目,大佬们方便的话也点下star呗,非常感谢:
  BootstrapAdmin 项目地址:
  https://gitee.com/LongbowEnterprise/BootstrapAdmin

  SliderCaptcha 项目地址:
  https://gitee.com/LongbowEnterprise/SliderCaptcha
 
交流群(QQ)欢迎加群讨论
       BA & Blazor ①(795206915)          BA & Blazor ②(675147445)


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

河曲智叟

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表