我有很多服务托管的应用程序。它包含ServiceA
和ServiceB
。他们使用方法AddHostedService
托管:
var hostBuilder = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<ServiceA>();
services.AddHostedService<ServiceB>();
});
using (var host = hostBuilder.Build())
{
host.Start();
host.WaitForShutdown();
}
我知道在ServiceA启动后将运行ServiceB
。停止服务的顺序是什么?停止ServiceA
之后,ServiceB
会停止保证吗?
答案 0 :(得分:4)
IHostedService
的实现按添加顺序(source)开始:
_hostedServices = Services.GetService<IEnumerable<IHostedService>>(); foreach (var hostedService in _hostedServices) { // Fire IHostedService.Start await hostedService.StartAsync(cancellationToken).ConfigureAwait(false); }
在上面的代码段中,Services.GetService<IEnumerable<IHostedService>>()
从DI容器中以IHostedService
的形式检索IEnumerable<T>
的所有实现。这些按注册时的顺序排序。
以{strong>相反的顺序(source)终止了IHostedService
的实施:
foreach (var hostedService in _hostedServices.Reverse()) { // ... await hostedService.StopAsync(token).ConfigureAwait(false); // ... }
在您的示例场景中,ServiceA
将在ServiceB
之前开始,但它会停止 在之后{{ 1}}。