我创建了WcBackgroundService(由BackgroundService继承)并将其注入到OrdersController中。当前端 API 在重新启动端点上发送请求时,我将从我的工作线程执行 Restart 方法。
如上所述,当前的解决方案不会重新启动服务,只会创建后台服务的新实例并启动它。
下面是我的代码
Wc后台服务
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();
您必须取消在开始时传递的同一个令牌,只有这样它才会取消后台任务。
你应该在你的任务中实现取消,通过你正确传递的令牌取消并存储在某个地方,例如实现一个任务管理服务,你在你的 DI 容器中注册为单例(你也可以从你的 wcBackGroundService 获取令牌,如果您通过属性公开它),然后实现一个控制器端点,比方说“RestartBackgroundTask”,它从单例服务获取令牌或 tokenSource 并取消它,然后再次调用 start 方法。您可以将 task.Start 移动到单独的函数中,这样您就可以使用所有相同的逻辑,而无需重复代码。
了解取消令牌源 https://learn.microsoft.com/en-us/dotnet/api/system.threading.cancellationtokensource?view=netframework-4.7.2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)