1

我一直在调查我们使用 .NET 通用主机来托管控制台应用程序。与 ASP.NET Web 应用程序相比,这似乎是 .NET 的推荐模式,允许轻松使用 DI、日志记录、配置等,同时保持一致的 API。当我遇到这个来自 Microsoft 的示例时,我开始对它有所了解,该示例举例说明了 IHostApplicationLifetime 事件的使用:

using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace AppLifetime.Example;

public class ExampleHostedService : IHostedService
{
    private readonly ILogger _logger;

    public ExampleHostedService(
        ILogger<ExampleHostedService> logger,
        IHostApplicationLifetime appLifetime)
    {
        _logger = logger;

        appLifetime.ApplicationStarted.Register(OnStarted);
        appLifetime.ApplicationStopping.Register(OnStopping);
        appLifetime.ApplicationStopped.Register(OnStopped);
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("1. StartAsync has been called.");

        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("4. StopAsync has been called.");

        return Task.CompletedTask;
    }

    private void OnStarted()
    {
        _logger.LogInformation("2. OnStarted has been called.");
    }

    private void OnStopping()
    {
        _logger.LogInformation("3. OnStopping has been called.");
    }

    private void OnStopped()
    {
        _logger.LogInformation("5. OnStopped has been called.");
    }
}

我玩了一下,发现 .NET 广播应用程序正在启动的样板日志总是在我的 StartAsync 方法之后被记录。这让我想知道:对于这两种不同的模式应该用于何时以及用于什么用途(IHostApplicationLifetime.OnStarted 与 IHostedService.StartAsync)是否有任何一般性指导?似乎在文档中更多地讨论了实现 IHostedService,但对我来说,StartAsync 调用似乎发生在主机应用程序生命周期真正“开始”之前似乎很奇怪——因此有什么丢失/担心吗?

4

0 回答 0