【问题标题】:Manage cancellation on the Token in a .NET Core 3.0 Worker Service在 .NET Core 3.0 Worker 服务中管理令牌的取消
【发布时间】:2019-11-05 14:53:14
【问题描述】:

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

这是我用于测试的代码。

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

有什么办法可以避免异常,根据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;
        }
    }
}

【问题讨论】:

    标签: background-service .net-core-3.0


    【解决方案1】:

    我的解决方案

    从代码中可以看出,应用程序几乎所有时间都在 Task.Delay 中,因此从该代码中抛出异常是正确的。

    我将代码更改如下。

    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
    }
    

    【讨论】:

      猜你喜欢
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 1970-01-01
      • 2019-11-18
      相关资源
      最近更新 更多