我一直在调查我们使用 .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 调用似乎发生在主机应用程序生命周期真正“开始”之前似乎很奇怪——因此有什么丢失/担心吗?