繁体   English   中英

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

[英]dotnet console app, using generic host, HostedService, Windows Task Scheduler stays in running state

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

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

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

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

Windows Task Scheduler设置

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

这是预期的吗? 如果不是,我如何终止进程?

如果可以预料,那么在刚刚启动,运行和停止的预定控制台应用程序中使用“通用主机/托管服务”是否仍然有意义?

基于Microsoft.Extensions.Hosting 2.2.0的答案

由于您对通用主机的使用,此行为是预期的:

它会一直运行,直到关闭或处置为止,并且您没有适当的关闭机制。 我假定你所期望的通用主机关机后IHostedService.StartAsync(的CancellationToken)您的MyHostedService运行完成。 并非如此,因为可能还会依次注册和执行其他IHostedService实现,并且/或者长时间运行的BackgroundService在其ExecuteAsync(CancellationToken)未同步完成以允许其他服务并行运行时返回控制。

要停止你的应用程序你摆好后MyHostedService运行通过主机时完成RunAsync ,你应该构造函数注入IApplicationLifetime到您的MyHostedService并调用StopApplication你的任务已经完成了。

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

另外,可以通过AppDomain.CurrentDomain.ProcessExitConsole.CancelKeyPress停止应用程序,这两个事件都由ConsoleLifetime订阅,该控制台已预先注册为默认生存期实现。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM