gpt4 book ai didi

c# - 如何从 Controller 重启 BackgroundService

转载 作者:行者123 更新时间:2023-11-30 22:56:07 26 4
gpt4 key购买 nike

我创建了 WcBackgroundService(由 BackgroundService 继承)并将其注入(inject)到 OrdersController。当前端 API 在重启端点上发送请求时,我将从我的工作人员执行重启方法。

如上所述,当前的解决方案不会重启服务,只会创建我的后台服务的新实例并启动它。

下面是我的代码

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();

最佳答案

您必须取消在开始时传递的 THE SAME token ,然后它才会取消后台任务。

你应该在你的任务中实现取消,通过你正确传递的 token 取消并存储在某个地方,例如实现一个任务管理服务,你在你的 DI 容器中注册为单例(你也可以从你的 wcBackGroundService 如果你通过属性公开它),然后实现一个 Controller 端点让我们说“RestartBackgroundTask”,它从单例服务获取 token 或 tokenSource 并取消它,然后再次调用 start 方法。您可以将 task.Start 移动到一个单独的函数中,这样您就可以使用相同的逻辑而无需重复代码。

Read about cancellationTokenSource

关于c# - 如何从 Controller 重启 BackgroundService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54685345/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com