簡體   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