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();//要释放

    }

}


相关文章
|
1月前
|
人工智能 弹性计算 机器人
如何在阿里云一键部署FlowiseAI
FlowiseAI 是一款开源低代码开发工具,专为构建定制化的语言学习模型(LLM)应用设计。用户可通过拖放界面轻松创建和管理AI驱动的应用,如聊天机器人和数据分析工具。它基于LangChain框架,支持多种AI模型和数据库集成,实现高度定制化的流程自动化。在阿里云上,可以通过一键部署链接快速部署FlowiseAI,并通过简单的几步配置开始使用。详细操作步骤包括创建ECS实例、获取登录信息等。更多细节可见FlowiseAI官网。
|
2月前
|
缓存 前端开发 JavaScript
|
Python 应用服务中间件 nginx
在阿里云上部署ERPNext
ERPNext是一款开源ERP软件,由Rushabh Mehta于2010年创建,它包含了会计、库存、制造、CRM、销售、采购、项目管理,及人事管理等多个功能模块。本文主要介绍如何在阿里云上部署ERPNext。
6500 0
计算巢托管版支持使用ISV成员账户进行资源部署功能说明
# 计算巢简介 计算巢是阿里云开放给ISV与其客户的服务管理PaaS平台,旨在解决ISV云上交付、部署、运维问题,建立ISV与客户之间的通道。针对ISV的实际场景,计算巢提供了私有化部署、托管版部署、代运维服务三种模式。托管版和私有化部署的区别是针对于部署在ISV的账号下还是部署在用户账号下。 本文针对托管版可以将资源部署到ISV资源目录成员账户下的功能进行说明,这样可以实现ISV账户下不同服务实
计算巢托管版支持使用ISV成员账户进行资源部署功能说明
|
运维 监控 安全
为什么要选择网站托管服务?网站托管服务的好处是什么
网站托管不但可以解决企业在网站建设后缺乏专业人员运营维护的问题,让专业的人做专业的事情,还可以通过网站托管服务,提升网站的搜索排名为企业带来品牌效益。
246 0
为什么要选择网站托管服务?网站托管服务的好处是什么
|
存储 负载均衡 监控
在AWS上部署一个网站
在AWS上部署一个网站
153 0
|
运维 JavaScript 网络协议
Serverless实践-静态网站托管
本文旨在帮助不懂运维/网络/服务器知识的小白,在不租用云服务器的情况下,实现Web站点的上线部署 适合边看文章边跟着动手做 包含使用Github Action实现持续集成的步骤,绑定自定义域名等等 该手把手Serverless实践系列预计会出几篇包含静态站点,云函数,后端服务等等 如有表述不清,内容错误等还请评论区斧正
|
应用服务中间件 Linux nginx
使用ReadtheDocs托管文档
很多的技术文档都是使用的ReadtheDocs,比如Python文档、tornado文档等等。今天我们一起来看看怎么使用ReadtheDocs托管文档。
385 0
使用ReadtheDocs托管文档
|
监控 安全 数据中心
|
C++ .NET 开发框架