使用通用主机,HostedService,Windows Task Scheduler的dotnet控制台应用程序保持运行状态

时间:2019-04-26 10:38:24

标签: .net-core console-application windowstaskschedule

试图弄清楚为什么我的控制台应用程序不会停止运行。

在dotnet核心应用程序主要方法中使用以下方法:

await new HostBuilder().
...
 .ConfigureServices((hostContext, services) =>
  {     
     services.AddHostedService<MyHostedService>(); 
  })
 .UseConsoleLifetime()
 .Build()
 .RunAsync();

使用以下设置从Windows任务计划程序发布和计划任务:

Windows Task Scheduler settings

到目前为止一切都很好。所有代码均已正确执行。但是,任务保持运行状态,该过程永无止境。 (即使在任务计划程序的用户界面上按刷新后,也是如此)

这是预期的吗?如果没有,该如何终止程序?

如果期望的话,在计划的启动,运行和停止的控制台应用程序中使用“通用主机/托管服务”是否仍然有意义?

1 个答案:

答案 0 :(得分:1)

基于Microsoft.Extensions.Hosting 2.2.0

的答案

由于您使用了Generic Host,因此出现了这种现象:

它会一直运行直到关闭或处置,并且您没有关闭机制。我假设您期望MyHostedService的{​​{3}}运行完毕后Generic Host关闭。情况并非如此,因为可能还会依次注册和执行其他IHostedService.StartAsync(CancellationToken)个实现,并且/或者长时间运行的IHostedService会在BackgroundService不能同步完成时返回控制权,从而允许其他服务以并行运行。

要在通过ExecuteAsync(CancellationToken)运行主机时MyHostedService完成后正常停止应用程序,则应将RunAsync constructor-inject插入MyHostedService并调用{ {3}}完成任务后。

internal class MyHostedService : IHostedService
{
    private readonly IApplicationLifetime _appLifetime;

    public MyHostedService(IApplicationLifetime appLifetime)
    {
        _appLifetime = appLifetime;
    }

    public async Task StartAsync(CancellationToken cancellationToken)
    {
        await Task.Delay(1000); //your scheduled work

        _appLifetime.StopApplication();
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        return Task.CompletedTask;
    }
}

此外,可以通过IApplicationLifetimeStopApplication停止应用程序,两个事件都由AppDomain.CurrentDomain.ProcessExit订阅,Console.CancelKeyPress已预先注册为默认生存期实现。

您可以在ConsoleLifetime中阅读有关生命周期管理的更多信息。

Microsoft.Extensions.Hosting 3.0.0-当前处于预览状态-标记为IApplicationLifetime已过时,建议改用IHostApplicationLifetime