C# 动态创建.NET BackgroundService并管理其生存期
我在.NET中有一个后台服务() 我不确定它是否有效。尽管我在属于后台服务的C# 动态创建.NET BackgroundService并管理其生存期,c#,.net,background-service,C#,.net,Background Service,我在.NET中有一个后台服务() 我不确定它是否有效。尽管我在属于后台服务的ExecuteAsync方法中看到断点,但我无法逐行遍历,它只是消失了。我不确定是否正确启动了它,或者在HTTP请求关闭时它是否被取消(因此我使用新的CancellationToken,而不是从控制器POST调用传递一个) 我想异步启动后台服务。我还有另一个控制器调用来停止MyService(它将调用StopAsync调用) 我做错什么了吗?BackgroundService是ASP.NET核心的一部分。您不应该调用St
ExecuteAsync
方法中看到断点,但我无法逐行遍历,它只是消失了。我不确定是否正确启动了它,或者在HTTP请求关闭时它是否被取消(因此我使用新的CancellationToken,而不是从控制器POST调用传递一个)
我想异步启动后台服务。我还有另一个控制器调用来停止MyService(它将调用StopAsync调用)
我做错什么了吗?
BackgroundService
是ASP.NET核心的一部分。您不应该调用StartAsync
,这是通过DI注入的HostedService
启动例程的一部分(框架维护您服务的生命周期)。据我所知,这不是它的预期用途。我理解HostedService部分。如问题所示,我在启动时正确使用了它。但是,我使用的控制器旨在测试具有不同配置的各种后台服务实例。你的建议是什么我建议你将所有业务逻辑从你的后台服务抽象到另一个服务——可能是一个临时服务。然后将临时服务注入到BackgroundService和测试代码中。BackgroundService
是ASP.NET核心的一部分。您不应该调用StartAsync
,这是通过DI注入的HostedService
启动例程的一部分(框架维护您服务的生命周期)。据我所知,这不是它的预期用途。我理解HostedService部分。如问题所示,我在启动时正确使用了它。但是,我使用的控制器旨在测试具有不同配置的各种后台服务实例。你的建议是什么我建议你将所有业务逻辑从你的后台服务抽象到另一个服务——可能是一个临时服务。然后将临时服务注入后台服务和测试代码中。
public class MyService<TElement, TKey, TValue> : BackgroundService
_serviceCollection.AddHostedService<MyService<TElement, TKey, TValue>>();
[HttpPost("myservice/perf/start")]
public async Task<IActionResult> StartServiceAsync(CancellationToken cancellationToken, [FromBody] ServiceParameters params)
{
await Task.Run( () => {
// Start the consumer service if not already started
// retrieve service instance
var _myServiceInstance = GetMyService( params );
_myServiceInstance .StartAsync(new CancellationToken());
});
}