停止应用程序时停止服务的顺序是什么

时间:2019-09-10 09:08:28

标签: c# asp.net-core .net-core

我有很多服务托管的应用程序。它包含ServiceAServiceB。他们使用方法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会停止保证吗?

1 个答案:

答案 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}}。