gpt4 book ai didi

c# - 如何实现只运行一次的.net core IHostedService

转载 作者:行者123 更新时间:2023-12-03 18:25:05 24 4
gpt4 key购买 nike

我知道一个 IHostedService只运行一次听起来像一个控制台应用程序,但我想使用它而不是一个普通的控制台应用程序的原因是:

  • .net core 介绍 Generic Host用于运行非 http 应用程序
  • 一个普通的控制台应用程序没有准备使用的 DI、记录器、配置

  • 通过使用以下代码,我可以在一定程度上实现这种一次性行为,但是,我找不到在应用程序完成后正常退出应用程序的方法。

    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;
    }
    }

    如何优雅地停止应用程序?
    或者如果这是完全错误的,我应该如何实现这个一次性应用程序?

    最佳答案

    如果您只是使用 IHostedService作为丢失 DI 和 ILogger 的解决方法您还可以使用 ILogger 设置 DI和 IConfiguration直接没有IHostedService

    public class Program
    {
    public static async Task Main(string[] args)
    {
    var configBuilder = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json", optional: true);
    var config = configBuilder.Build();

    var sp = new ServiceCollection()
    .AddLogging(b => b.AddConsole())
    .AddSingleton<IConfiguration>(config)
    .AddSingleton<IFooService, FooService>()
    .BuildServiceProvider();

    var logger = sp.GetService<ILoggerFactory>().CreateLogger<Program>();
    logger.LogDebug("Starting");

    var bar = sp.GetService<IFooService>();
    await bar.DoAsync();
    }
    }

    通过这种设置,您的代码只运行一次,可以解析您在 ServiceCollection 中注册的每个服务。并且不需要 Host开始

    示例: .netfiddle

    关于c# - 如何实现只运行一次的.net core IHostedService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60429341/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com