第二十一节:Asp.Net Core中使用托管服务实现后台任务
1. 说明
BackgroundService 是用于实现长时间运行的 IHostedService 的基类,使用程序集:Microsoft.Extensions.Hosting。
2. 实现方式
继承BackgroundService类,然后override ExecuteAsync这个方法,在这个方法内利用while循环执行长时间任务,stoppingToken.IsCancellationRequested判断是否取消, 可以用base.StopAsync(stoppingToken);停止这个任务的执行。
最后需要在 ConfigureService中注册: services.AddHostedService<TestBackService1>();
3. 实战测试
1 public class TestBackService1 : BackgroundService 2 { 3 protected async override Task ExecuteAsync(CancellationToken stoppingToken) 4 { 5 6 while (!stoppingToken.IsCancellationRequested) 7 { 8 try 9 { 10 StreamWriter sw = System.IO.File.AppendText("Log/test.txt"); 11 //追加文本 12 await sw.WriteLineAsync($"当前时间为:{DateTime.Now}");//自动换行 13 sw.Close(); 14 15 await Task.Delay(TimeSpan.FromSeconds(60)); 16 17 //测试报错,进入catch停止后台任务 18 //int.Parse("dsfs"); 19 20 } 21 catch (Exception ex) 22 { 23 StreamWriter sw = System.IO.File.AppendText("Log/test.txt"); 24 await sw.WriteLineAsync($"当前时间为:{DateTime.Now},报错了:{ex.Message}");//自动换行 25 sw.Close(); 26 27 //根据实际业务情况,决定报错了是继续执行还是停止改后台任务 28 //await base.StopAsync(stoppingToken); 29 } 30 } 31 } 32 }
1 public void ConfigureServices(IServiceCollection services) 2 { 3 services.AddControllersWithViews(); 4 5 //注册后台托管服务 6 services.AddHostedService<TestBackService1>(); 7 }
最终结论:
我们把这个案例挂到IIS上测试,启动该项目,发现20分钟后不再写入日志,这是因为IIS默认的闲置超时是20分钟,IIS将回收;我们把他改为120分钟,经测试发现120分钟后将不在写入了。
注:闲置超时20分钟,是指20分钟内没有任何请求进行访问,如果有请求则这个闲置超时时间会重新计算。如果场景是定时任务,且期间没有请求,该方案不适合,因为IIS会回收它,这一点类似Quartz.Net 部署在IIS上是一个道理的。
如果场景是利用队列发送聊天消息,消息是会经常发送的,经常有请求,所有这个场景是可以用的。
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。