[英]Windows Service using .net core BackgroundService, how to gracefully stop?
[英]How to stop windows service when trhow exception? NET CORE
我在 .NET 核心 3.1 中有一個 Windows 服務的示例。
我正在生成一個故意錯誤以查看其行為,我的想法是當異常發生時我想調用 StopAsync 方法來停止服務,但是一旦執行 StopAsync 再次執行 ExecuteAsync 方法並且服務不會停止,像這樣進入無限循環。
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
await Task.CompletedTask;
while (!stoppingToken.IsCancellationRequested)
{
try
{
int num = 233;
int result = num / 0;
//todo
}
catch (Exception ex)
{
_logger.LogError(ex.Message);
await StopAsync(stoppingToken); //this execute, but it keeps running this ExecuteAsync method
}
}
}
public override async Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("stop service");
await base.StopAsync(cancellationToken);
}
ExecuteAsync 方法再次執行,服務沒有停止,像這樣進入無限循環。
您確定嗎? StopAsync
將取消提供給ExecuteAsync
的令牌,看起來您的ExecuteAsync
方法將在這種情況下完成。
但是,主機應用程序本身將繼續運行; 也許這就是你所看到的。 要在后台服務退出時關閉宿主應用程序, 您需要顯式停止應用程序:
private readonly IHostApplicationLifetime _hostApplicationLifetime;
public MyBackgroundService(IHostApplicationLifetime hostApplicationLifetime) =>
_hostApplicationLifetime = hostApplicationLifetime;
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
try
{
...
}
finally
{
_hostApplicationLifetime.StopApplication();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.