IHostedService

这个接口只包含两个成员方法:

Task StartAsync(CancellationToken cancellationToken);
Task StopAsync(CancellationToken cancellationToken);

Host中可以包含多个IHostedService服务实例。当然,如果是Web应用其中一个就是WebHost。Host起来之后,会依次启动所有添加的这些IHostedService服务。
下面我们给一个例子,如何在Web服务之外注入自己的一个服务程序。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection;
using System.Threading;
using System.Diagnostics;namespace aspnetapp
{public class Program{public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();}).ConfigureServices((hostContext, services) =>{services.AddHostedService<Worker>();});}public class Worker : IHostedService{public Task StartAsync(CancellationToken cancellationToken){Debug.WriteLine("Start");return Task.CompletedTask;}public Task StopAsync(CancellationToken cancellationToken){Debug.WriteLine("End");return Task.CompletedTask;}}
}

上面的例子中,Worker就是我们自己定义的一个服务程序。整个系统运行起来后,它会自动调用Worker.StartAsync()方法。

此外,如果我们想控制我们自己的服务程序的生命周期,那么可以使用IHostApplicationLifetime,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection;
using System.Threading;
using System.Diagnostics;namespace aspnetapp
{public class Program{public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();}).ConfigureServices((hostContext, services) =>{services.AddHostedService<Worker>();});}public class Worker : IHostedService{private readonly ILogger _logger;private readonly IHostApplicationLifetime _appLifetime;public Worker(ILogger<Worker> logger, IHostApplicationLifetime appLifetime){_logger = logger;_appLifetime = appLifetime;}public Task StartAsync(CancellationToken cancellationToken){_appLifetime.ApplicationStarted.Register(OnStarted);_appLifetime.ApplicationStopping.Register(OnStoping);_appLifetime.ApplicationStopped.Register(OnStopped);return Task.CompletedTask;}public Task StopAsync(CancellationToken cancellationToken){return Task.CompletedTask;}private void OnStarted(){_logger.LogInformation("OnStarted has been called.");}private void OnStoping(){_logger.LogInformation("OnStoping has been called.");}private void OnStopped(){_logger.LogInformation("OnStopped has been called.");}        }
}

Asp.net Core框架内部会自己注入一个IHostApplicationLifetime实例,它是Singleton的,也就是它是一个单一实例。所有注入的主机都用这一个IHostApplicationLifetime实例进行生命周期管理,那为什么单个生命周期管理实例就可以管多个主机的生命周期呢?这是由于Cancellationtoken对象的Register()方法是可以调用多次,即可以注册多次回调的委托方法的。IHostApplicationLifetime实例是在HostBuilder类中注入的(下面是截取的代码片段):

        private void CreateServiceProvider(){var services = new ServiceCollection();services.AddSingleton(_hostingEnvironment);services.AddSingleton(_hostBuilderContext);services.AddSingleton(_appConfiguration);services.AddSingleton<IApplicationLifetime, ApplicationLifetime>();services.AddSingleton<IHostLifetime, ConsoleLifetime>();services.AddSingleton<IHost, Host>();services.AddOptions();services.AddLogging();// ....// ....

上面这段是找到的官方源码,应该不是微软最新的。IApplicationLifetime其实就是现在的IHostApplicationLifetime。IApplicationLifetime已经做旧,已经被IHostApplicationLifetime替代,两个接口内部的定义完全一样。但是就是找不到IHostApplicationLifetime官方源码,只是从别人的博客里看到说两个接口是一样的。

Asp.net core 3.1利用IHostedService为系统注入自己的主机相关推荐

  1. Asp.Net Core 轻松学-利用日志监视进行服务遥测

    原文:Asp.Net Core 轻松学-利用日志监视进行服务遥测 前言     在 Net Core 2.2 中,官方文档表示,对 EventListener 这个日志监视类的内容进行了扩充,同时赋予 ...

  2. 避免在 ASP.NET Core 3.0 中为启动类注入服务

    本篇是如何升级到ASP.NET Core 3.0系列文章的第二篇. Part 1 - 将.NET Standard 2.0 类库转换为.NET Core 3.0 类库 Part 2 - IHostin ...

  3. ASP.NET Core 3.x控制IHostedService启动顺序浅探

    想写好中间件,这是基础.   一.前言 今天这个内容,基于于ASP.NET Core 3.x. 从3.x开始,ASP.NET Core使用了通用主机模式.它将WebHostBuilder放到了通用的I ...

  4. ASP.NET Core 2.0利用MassTransit集成RabbitMQ

    在ASP.NET Core上利用MassTransit来集成使用RabbitMQ真的很简单,代码也很简洁.近期因为项目需要,我便在这基础上再次进行了封装,抽成了公共方法,使得使用RabbitMQ的调用 ...

  5. ASP.NET Core Web 应用程序开发期间部署到IIS自定义主机域名并附加到进程调试

    想必大家之前在进行ASP.NET Web 应用程序开发期间都有用到过将我们的网站部署到IIS自定义主机域名并附加到进程进行调试. 那我们的ASP.NET Core Web 应用程序又是如何部署到我们的 ...

  6. .NET Core ASP.NET Core Basic 1-2 控制反转与依赖注入

    本节内容为控制反转与依赖注入 简介 控制反转IOC 这个内容事实上在我们的C#高级篇就已经有所讲解,控制反转是一种设计模式,你可以这样理解控制反转,假设有一个人他有一部A品牌手机,他用手机进行听歌.打 ...

  7. ASP.NET Core如何在ActionFilterAttribute里做依赖注入

    点击蓝字 关注我 在ASP.NET Core里,我们可以使用构造函数注入很方便地对Controller,ViewComponent等部件做依赖注入.但是如何给过滤器ActionFilterAttrib ...

  8. 一个基于Microsoft Azure、ASP.NET Core和Docker的博客系统

    2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客.当然,我写博客也不是从2008年才开始的,在更早时候,也在CSDN和系统分析员协会(之后名为"希赛网" ...

  9. 控制反转_.NET Core ASP.NET Core Basic 12 控制反转与依赖注入

    本节内容为控制反转与依赖注入 简介 控制反转IOC 这个内容事实上在我们的C#高级篇就已经有所讲解,控制反转是一种设计模式,你可以这样理解控制反转,假设有一个人他有一部A品牌手机,他用手机进行听歌.打 ...

最新文章

  1. semantic computing Cognitive linguistics Distributed intelligence
  2. linux特殊符号大全
  3. 一个供应商只允许一个报价单
  4. java小编程----str中没有内容
  5. c语言静态成员变量重名会怎么样,C++中静态成员函数与静态成员变量(static )...
  6. C#.Net工作笔记014---C#中internal的意思
  7. JVM学习笔记 -- 从一段几乎所有人代码都会犯错的代码开始
  8. js_单例模式制作无限弹窗(3s内销毁)
  9. pdf417条形码开发
  10. 最简单的WIN7内核PE系统(U盘,硬盘,移动硬盘版支持原版WIN7安装
  11. 【Linux operation 09】 - SUSE 12 SP5官网下载
  12. edge播放视频HTML5黑屏,Win10 edge 浏览器 播放视频黑屏解决方法
  13. java无法双击打开.jar文件/jar包以压缩文件显示
  14. 2022最新批量删除微博教程!支持批量删除微博批量删除清空点赞关注评价以及粉丝
  15. jQuery推箱子小游戏
  16. 百篇已过,又是一个新篇章,谈谈感受吧
  17. POI删除Excel中数据有效性
  18. Ajax和Json使用
  19. 【JAVA今法修真】 第二章 一气化三清 线程分心念
  20. python小黄鸡nlp聊天机器人

热门文章

  1. 初来乍到,先测试一下
  2. matlab代码搜集网站,欢迎补充
  3. 693-详解ICMP 协议
  4. 智能运维实践——魅族技术开放日第十三期现场纪实
  5. 联想电脑怎样把计算机放桌面,怎样在电脑桌面上添加文字提醒
  6. labelImg图像标注工具的详细使用
  7. rados tools
  8. MatLab画贝塞尔函数曲线
  9. 【软件设计师】下午题总结
  10. 【CE实战】Clicker Heroes 快速通关