如何从Controller重新启动BackgroundService

时间:2019-02-14 07:40:26

标签: c# asp.net-core

我创建了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 :(得分:2)

您必须取消在开始时传递的THE SAME令牌,然后才能取消后台任务。

您应该在任务中实施取消,取消您正确传递并存储在某个地方的令牌的功能,例如实施一项任务管理服务,该服务在您的DI容器中注册为单例(您也可以从您的wcBackGroundService(如果通过属性公开它),然后实现一个控制器端点,例如说“ RestartBackgroundTask”,它从单例服务中获取令牌或tokenSource并取消它,然后再次调用start方法。您可以移动任务。开始进入一个单独的函数,这样就可以实现所有相同的逻辑而无需代码重复。

Read about cancellationTokenSource