8.4 托管服务

简介: 有些工作是需要后台运行的,比如每天凌晨备份数据库。ASP.NET Core提供了托管服务来供我们编写后台代码。托管服务只需要实现`IHostedService`即可,一般在开发时编写继承自`BackgroundService`的类,该类不进实现了`IHostedService`接口,并且处理了任务取消等逻辑,我们只需实现`BackgroundService`中定义的`ExecuteAsync`方法即可。

8.4 托管服务

有些工作是需要后台运行的,比如每天凌晨备份数据库。ASP.NET Core提供了托管服务来供我们编写后台代码。

托管服务只需要实现IHostedService即可,一般在开发时编写继承自BackgroundService的类,该类不进实现了IHostedService接口,并且处理了任务取消等逻辑,我们只需实现BackgroundService中定义的ExecuteAsync方法即可。

托管服务案例:

publicclassDemoBgService : BackgroundService

{

    privateILogger<DemoBgService>logger;

    publicDemoBgService(ILogger<DemoBgService>logger)

    {

        this.logger=logger;

    }

    protectedoverrideasyncTaskExecuteAsync(CancellationTokenstoppingToken)

    {

        awaitTask.Delay(5000);

        strings=awaitFile.ReadAllTextAsync("d:/1.txt");

        awaitTask.Delay(20000);

        logger.LogInformation(s);

    }

}

在Program.cs中进行注册

builder.Services.AddHostedService<DemoBgService>();

托管服务会随着应用程序的启动而启动,如果托管服务出现异常且没有捕获,则整个程序就会崩掉,设置HostOptions.BackgroundServiceExceptionBehavior设置为Ignore,这样会忽略这个异常,但是不推荐这种设置,推荐使用Try,并把异常输出到日志。

托管服务中使用依赖注入的陷阱

长生命周期的服务不能依赖短依赖周期的服务,托管服务为单例声明周期,所以不能在托管服务中注入范围或者瞬态服务。

可以通过构造方法注入IServiceScopeFactory服务,它可以用来创建IserviceScope对象

案例:

publicclassExplortStatisticBgService : BackgroundService

{

    privatereadonlyTestDbContextctx;

    privatereadonlyILogger<ExplortStatisticBgService>logger;

    privatereadonlyIServiceScopeserviceScope;

   //通过构造函数注入IServiceScopeFactory服务

    publicExplortStatisticBgService(IServiceScopeFactoryscopeFactory)

    {

        this.serviceScope=scopeFactory.CreateScope();//通过Factory创建IServiceScope对象

        varsp=serviceScope.ServiceProvider;

       //获得Scope对象

        this.ctx=sp.GetRequiredService<TestDbContext>();

        this.logger=sp.GetRequiredService<ILogger<ExplortStatisticBgService>>();

    }

    protectedoverrideasyncTaskExecuteAsync(CancellationTokenstoppingToken)

    {

        while (!stoppingToken.IsCancellationRequested)//长期的后台服务,一直运行在后台

        {

            try//使用try

            {

                awaitDoExecuteAsync();

                awaitTask.Delay(5000);

            }

            catch (Exceptionex)

            {

                logger.LogError(ex, "获取用户统计数据失败");

                awaitTask.Delay(1000);

            }

        }

    }

    privateasyncTaskDoExecuteAsync()

    {

        varitems=ctx.Users.GroupBy(u=>u.CreationTime.Date)

                        .Select(e=>new { Date=e.Key, Count=e.Count() });

        StringBuildersb=newStringBuilder();

        sb.AppendLine($"Date:{DateTime.Now}");

        foreach (variteminitems)

        {

            sb.Append(item.Date).AppendLine($":{item.Count}");

        }

        awaitFile.WriteAllTextAsync("d:/1.txt", sb.ToString());

        logger.LogInformation($"导出完成");

    }

    publicoverridevoidDispose()

    {

        base.Dispose();

        serviceScope.Dispose();//要释放

    }

}


相关文章
|
弹性计算 运维 关系型数据库
云上部署环境(基础设施)的正确姿势——使用资源编排ROS进行基础设施的部署
![image.png](https://ata2-img.cn-hangzhou.oss-pub.aliyun-inc.com/66daa0b176da97de1dc8e66580fc0384.png) # 常见的部署问题 1. 多环境部署。根据实际开发的需要,一般至少需要准备3个环境:日常测试环境,部署预发环境,部署生产环境。 2. 多地域部署。对于云产品还需要支持多地域部署
|
3月前
|
缓存 前端开发 JavaScript
|
6月前
|
弹性计算 Kubernetes Java
阿里云云效产品使用问题之是否支持其他云厂商的Serverless容器发布
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
Python 应用服务中间件 nginx
在阿里云上部署ERPNext
ERPNext是一款开源ERP软件,由Rushabh Mehta于2010年创建,它包含了会计、库存、制造、CRM、销售、采购、项目管理,及人事管理等多个功能模块。本文主要介绍如何在阿里云上部署ERPNext。
6570 0
|
7月前
|
弹性计算 运维 Java
部署本地私有代码到阿里云应用管理
对于用户不愿意托管到云上的私有代码,本文提出一种方案,结合云下持续集成和云上持续部署,支持将线下构建出的部署物持续部署到应用分组环境里。
计算巢托管版支持使用ISV成员账户进行资源部署功能说明
# 计算巢简介 计算巢是阿里云开放给ISV与其客户的服务管理PaaS平台,旨在解决ISV云上交付、部署、运维问题,建立ISV与客户之间的通道。针对ISV的实际场景,计算巢提供了私有化部署、托管版部署、代运维服务三种模式。托管版和私有化部署的区别是针对于部署在ISV的账号下还是部署在用户账号下。 本文针对托管版可以将资源部署到ISV资源目录成员账户下的功能进行说明,这样可以实现ISV账户下不同服务实
计算巢托管版支持使用ISV成员账户进行资源部署功能说明
|
运维 监控 安全
为什么要选择网站托管服务?网站托管服务的好处是什么
网站托管不但可以解决企业在网站建设后缺乏专业人员运营维护的问题,让专业的人做专业的事情,还可以通过网站托管服务,提升网站的搜索排名为企业带来品牌效益。
261 0
为什么要选择网站托管服务?网站托管服务的好处是什么
|
JSON Kubernetes 前端开发
openshift 创建一个Serverless应用程序
openshift 创建一个Serverless应用程序
openshift 创建一个Serverless应用程序
|
运维 JavaScript 网络协议
Serverless实践-静态网站托管
本文旨在帮助不懂运维/网络/服务器知识的小白,在不租用云服务器的情况下,实现Web站点的上线部署 适合边看文章边跟着动手做 包含使用Github Action实现持续集成的步骤,绑定自定义域名等等 该手把手Serverless实践系列预计会出几篇包含静态站点,云函数,后端服务等等 如有表述不清,内容错误等还请评论区斧正
|
应用服务中间件 Linux nginx
使用ReadtheDocs托管文档
很多的技术文档都是使用的ReadtheDocs,比如Python文档、tornado文档等等。今天我们一起来看看怎么使用ReadtheDocs托管文档。
400 0
使用ReadtheDocs托管文档