温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - Manage cancellation on the Token in a .NET Core 3.0 Worker Service
.net-core-3.0 background-service

其他 - 在.NET Core 3.0 Worker服务中管理令牌上的取消

发布于 2020-05-01 11:44:23

我正在开发我的第一个.NET Core 3.0 Worker服务,以将其作为Windows服务运行。

这是我用于测试的代码。

调试我看到停止Windows服务,将执行StopAsync(),但是由于OperationCanceledException异常(从Task.Delay(1000,stoppingToken)行抛出)而终止ExecuteAsync()。我当然可以抓住它,但是我想做的是完成方法流程以便正常退出。

有什么办法可以避免异常,而只是根据while条件退出?

namespace Enerj.MyAppCore.WorkerService
{
    public class Worker : BackgroundService
    {
        private readonly ILogger<Worker> _logger;
        bool exit = false;

        public Worker(ILogger<Worker> logger)
        {
            _logger = logger;
            _logger.LogInformation("ctor");
        }

        public override async Task StartAsync(CancellationToken cancellationToken)
        {
            _logger.LogInformation("Start");
            await base.StartAsync(cancellationToken);
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
                await Task.Delay(1000, stoppingToken);
            }
            System.Diagnostics.Debugger.Break();
        }

        public override async Task StopAsync(CancellationToken cancellationToken)
        {
            _logger.LogInformation("Stopping");
            await Task.CompletedTask;
        }
    }
}

查看更多

提问者
Tonyc
被浏览
23
Tonyc 2020-02-12 16:45

我的解决方案

从代码中可以明显看出,应用程序几乎所有时间都花在Task.Delay上,因此从该代码引发Exception是正确的。

我将代码更改如下。

while (!stoppingToken.IsCancellationRequested)
{
    _logger.LogInformation($"Worker running at: {DateTime.Now}");

    try
    {
        await Task.Delay(1000, stoppingToken);
    }
    catch (Exception exc)
    {
        _logger.LogError($"Error running at: {DateTime.Now}");
    }

    System.Diagnostics.Debugger.Break();

    // Other code
}