我知道一个只运行一次的IHostedService
听起来像一个控制台应用程序,但我想使用它而不是普通的控制台应用程序的原因是:
- .net core引入了通用主机(Generic Host)来运行非 HTTP 应用程序。
- 普通的控制台应用程序没有 DI 、Logger 和 Configurations 等功能可供使用。
通过使用以下代码,我能够在某种程度上实现这种一次性行为,然而我找不到一个优雅的方式在应用程序完成后退出。
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) => { services.AddHostedService<StartUp>(); });
}
当 StartUp
是一个简单的 IHostedService
时
public class StartUp:IHostedService
{
private ILogger<StartUp> _logger;
public StartUp(ILogger<StartUp> logger)
{
_logger = logger;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("start async");
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("stop async");
return Task.CompletedTask;
}
}
如何优雅地停止应用程序?或者如果这样完全是错误的,我应该如何实现一次性应用程序?