Как перезапустить BackgroundService из контроллера - PullRequest
0 голосов
/ 14 февраля 2019

Я создал WcBackgroundService (наследуемый BackgroundService) и внедряю его в OrdersController.Когда API внешнего интерфейса отправляет запрос на конечную точку перезапуска, я выполняю метод Restart от моего работника.

Как указано выше, текущее решение не перезапускает службу, только создает новый экземпляр моей фоновой службы и запускает ее.

Ниже приведен мой код

WcBackgroundService

public async Task Restart()
{
    await StopAsync(new CancellationToken());
    await StartAsync(new CancellationToken());
}

protected override async Task ExecuteAsync(CancellationToken cancellationToken)
{
     cancellationToken.Register(() =>
     {
         _logger.Debug($"Service {_serviceType} is stopping.");
     });

     while (!cancellationToken.IsCancellationRequested)
     {
         await DoWork();
     }
}

Настройка служб при запуске:

..
services.AddSingleton<IWcBackgroundService, WcBackgroundService>();
..

Настройка при запуске:

var wcBackgroundService = app.ApplicationServices.GetService<IWcBackgroundService>();
wcBackgroundService.StartAsync(new CancellationToken()).Wait();

1 Ответ

0 голосов
/ 14 февраля 2019

Вы должны отменить на ЖЕ ЖЕ токене, который передается в начале, только тогда он отменит фоновое задание.

Вы должны реализовать отмену в вашей задаче, отменить через токен, который вы правильно передаетечерез и где-то хранить, например, внедрить службу управления задачами, которую вы регистрируете как одноэлементную в вашем контейнере DI (вы также можете получить токен из вашего wcBackGroundService, если вы выставите его через свойство), а затем реализовать конечную точку контроллера, скажем, «RestartBackgroundTask ", который получает токен или tokenSource из одноэлементной службы и отменяет его, а затем снова вызывает метод start.Вы можете переместить задачу. Начните в отдельной функции, чтобы вы могли использовать ту же логику без дублирования кода.

Прочтите об cancellationTokenSource

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...