zoukankan      html  css  js  c++  java
  • 第二十一节: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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
     
  • 相关阅读:
    5G(NR)无线网络协议栈 (层2和层3)
    tcp,udp报文最大长度
    MSS与MTU的关系
    5G网络(接入网+承载网+核心网)
    华为发布:5G时代十大应用场景白皮书(附下载)
    爱码仕 解读5G(八)再见了,SIM卡
    爱码仕 解读5G (七)无线娱乐在家里、在车里、在加油站、在充电站、在高速公路休息区
    爱码仕 解读5G (六)健康管理和无线医疗
    爱码仕 解读5G (五)能源领域 电力馈线自动化 智慧油田 智慧海洋
    在DevExpress中使用CameraControl控件进行摄像头图像采集
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/12013190.html
Copyright © 2011-2022 走看看