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

    }

}


相关文章
|
5天前
|
安全 网络安全 数据中心
服务器托管适用什么场景?
在数字化时代,服务器托管对企业运营至关重要。本文解析了五种常见托管方式:共享托管经济实惠,适合小型网站;VPS灵活可控,适合中小型企业;专用服务器性能卓越,适合大型应用;云托管灵活扩展,适应现代需求;托管式服务外包管理,省心省力。选择时需综合考虑预算、技术能力及性能要求,找到最佳解决方案。
16 0
|
6月前
|
缓存 前端开发 JavaScript
|
9月前
|
弹性计算 Kubernetes Java
阿里云云效产品使用问题之是否支持其他云厂商的Serverless容器发布
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
Kubernetes Cloud Native 安全
阿里云原生容器服务产品体系-ACK Pro 托管集群
阿里云原生容器服务产品体系-ACK Pro 托管集群
阿里云原生容器服务产品体系-ACK Pro 托管集群
|
运维 监控 安全
为什么要选择网站托管服务?网站托管服务的好处是什么
网站托管不但可以解决企业在网站建设后缺乏专业人员运营维护的问题,让专业的人做专业的事情,还可以通过网站托管服务,提升网站的搜索排名为企业带来品牌效益。
285 0
为什么要选择网站托管服务?网站托管服务的好处是什么
|
安全 搜索推荐 SEO
如何选择网站托管服务公司?网站托管服务有哪些注意事项
当今互联网环境下,企业把网站外包给专业的网站托管公司已成为企业在网络市场寻求长远发展的关键条件,通过网站托管服务,企业网站既能获得更加专业的技术和服务支持,又能大大降低企业运营成本,同时网站运营效果也能得到更好的保证。
299 0
如何选择网站托管服务公司?网站托管服务有哪些注意事项
|
运维 JavaScript 网络协议
Serverless实践-静态网站托管
本文旨在帮助不懂运维/网络/服务器知识的小白,在不租用云服务器的情况下,实现Web站点的上线部署 适合边看文章边跟着动手做 包含使用Github Action实现持续集成的步骤,绑定自定义域名等等 该手把手Serverless实践系列预计会出几篇包含静态站点,云函数,后端服务等等 如有表述不清,内容错误等还请评论区斧正
|
应用服务中间件 Linux nginx
使用ReadtheDocs托管文档
很多的技术文档都是使用的ReadtheDocs,比如Python文档、tornado文档等等。今天我们一起来看看怎么使用ReadtheDocs托管文档。
421 0
使用ReadtheDocs托管文档
|
Prometheus 监控 Kubernetes
最省时省力的Kubernetes集群监控方案 - 阿里云 Prometheus 托管服务免费公测中
阿里云Prometheus方案给用户提供最省时省力的 Kubernetes容器平台的自动化运维监控,而且大幅提升了监控系统的可靠性、易用性、自动化和安全性。
2657 0