Как перезапустить фоновый сервис в .net core 2.2 - PullRequest
0 голосов
/ 15 октября 2019

Я создаю BackgroundService в своем проекте, используя класс .net core 2.2 BackgroundService, у меня возникла проблема при попытке перезапустить службу, я заметил, что когда я вызываю функцию «StartAsync» (после запуска «StopAsync»)функция) Функция «ExcecuteAsync» вызывается (базовой функцией StartAsync) с отмененным токеном. Посмотрев на класс BackgroundService, я заметил, что BackgroundService содержит внутренний CancellationTokenSource, который я нигде не могу сбросить. Источник BackgroundService .

Есть ли способ сбросить или заменить cancellationToken внутри BackgroundService?

Пример кода:

namespace Services.Background
{
    [DisplayName("Device Structure Service")]
    public class DeviceStructureService : BackgroundService
    {

        private readonly ILogger<DeviceStructureService> _logger;

        public DeviceStructureService(ILogger<DeviceStructureService> logger)
        {
            _logger = logger;            
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            stoppingToken.Register(() =>  _logger?.LogDebug($"{serviceName} background task is stopping."));

            while (!stoppingToken.IsCancellationRequested)
            {                

                _logger?.LogInformation($"The {serviceName} running at: {DateTimeOffset.Now}");
                try
                {
                    await DoWork();
                }
                catch (Exception exception)
                {
                    _logger?.LogCritical(exception.ToString());
                }
                await Task.Delay(1000, stoppingToken);

            }

            await StopAsync(stoppingToken);


        }

        public override Task StopAsync(CancellationToken cancellationToken)
        {
            _logger?.LogInformation($"The {serviceName} stopped at: {DateTime.Now}");

            return base.StopAsync(cancellationToken);
        }

        public override Task StartAsync(CancellationToken cancellationToken)
        {
            _logger?.LogInformation($"The {serviceName} started at: {DateTime.Now}");

            return base.StartAsync(cancellationToken);
        }

    }
}

1 Ответ

0 голосов
/ 15 октября 2019

Есть ли способ сбросить или заменить cancellationToken внутри BackgroundService?

Нет

, поскольку целевым источником токена является private и readonly вбазовый класс.

BackgroundService

private readonly CancellationTokenSource _stoppingCts = new CancellationTokenSource();

Поскольку доступен исходный код BackgroundService, создание локальной версии с нужной функциональностью ничто не мешает

...