作者:wonderoil | 来源:互联网 | 2023-10-13 13:46
1. 说明
BackgroundService 是用于实现长时间运行的 IHostedService 的基类,使用程序集:Microsoft.Extensions.Hosting。
2. 实现方式
继承BackgroundService类,然后override ExecuteAsync这个方法,在这个方法内利用while循环执行长时间任务,stoppingToken.IsCancellationRequested判断是否取消, 可以用base.StopAsync(stoppingToken);停止这个任务的执行。
最后需要在 ConfigureService中注册: services.AddHostedService();
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();
7 }
最终结论:
我们把这个案例挂到IIS上测试,启动该项目,发现20分钟后不再写入日志,这是因为IIS默认的闲置超时是20分钟,IIS将回收;我们把他改为120分钟,经测试发现120分钟后将不在写入了。
注:闲置超时20分钟,是指20分钟内没有任何请求进行访问,如果有请求则这个闲置超时时间会重新计算。如果场景是定时任务,且期间没有请求,该方案不适合,因为IIS会回收它,这一点类似Quartz.Net 部署在IIS上是一个道理的。
如果场景是利用队列发送聊天消息,消息是会经常发送的,经常有请求,所有这个场景是可以用的。
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。