我创建了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();
答案 0 :(得分:2)
您必须取消在开始时传递的THE SAME令牌,然后才能取消后台任务。
您应该在任务中实施取消,取消您正确传递并存储在某个地方的令牌的功能,例如实施一项任务管理服务,该服务在您的DI容器中注册为单例(您也可以从您的wcBackGroundService(如果通过属性公开它),然后实现一个控制器端点,例如说“ RestartBackgroundTask”,它从单例服务中获取令牌或tokenSource并取消它,然后再次调用start方法。您可以移动任务。开始进入一个单独的函数,这样就可以实现所有相同的逻辑而无需代码重复。