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

    }

}


相关文章
|
4月前
|
缓存 前端开发 JavaScript
|
7月前
|
弹性计算 Kubernetes Java
阿里云云效产品使用问题之是否支持其他云厂商的Serverless容器发布
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
Kubernetes Cloud Native 安全
阿里云原生容器服务产品体系-ACK Pro 托管集群
阿里云原生容器服务产品体系-ACK Pro 托管集群
阿里云原生容器服务产品体系-ACK Pro 托管集群
|
8月前
|
运维 Serverless 应用服务中间件
Serverless 应用引擎产品使用之在Serverless应用引擎(SAE)中,在创建ALB时找不到对应的SAE容器如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
人工智能 弹性计算 运维
阿里云容器服务 Serverless 版(ACK Serverless)全新升级
阿里云容器服务 Serverless 版(ACK Serverless)全新升级
1620 10
|
Prometheus 监控 Cloud Native
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ASK 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
|
运维 监控 安全
为什么要选择网站托管服务?网站托管服务的好处是什么
网站托管不但可以解决企业在网站建设后缺乏专业人员运营维护的问题,让专业的人做专业的事情,还可以通过网站托管服务,提升网站的搜索排名为企业带来品牌效益。
265 0
为什么要选择网站托管服务?网站托管服务的好处是什么
|
运维 JavaScript 网络协议
Serverless实践-静态网站托管
本文旨在帮助不懂运维/网络/服务器知识的小白,在不租用云服务器的情况下,实现Web站点的上线部署 适合边看文章边跟着动手做 包含使用Github Action实现持续集成的步骤,绑定自定义域名等等 该手把手Serverless实践系列预计会出几篇包含静态站点,云函数,后端服务等等 如有表述不清,内容错误等还请评论区斧正
|
应用服务中间件 Linux nginx
使用ReadtheDocs托管文档
很多的技术文档都是使用的ReadtheDocs,比如Python文档、tornado文档等等。今天我们一起来看看怎么使用ReadtheDocs托管文档。
402 0
使用ReadtheDocs托管文档
|
安全 Serverless 开发者
阿里云宣布推出Serverless Kubernetes服务 30秒即可完成应用部署
阿里云宣布推出Serverless Kubernetes服务,容器服务新增Serverless形态。
21780 1

热门文章

最新文章