我正在尝试使用IHostedService创建后台服务。如果我只有一个后台服务,一切都会正常。当我尝试创建IHostedService
的多个实现时,只有第一个注册的实现才真正运行。
services.AddSingleton<IHostedService, HostedServiceOne>();
services.AddSingleton<IHostedService, HostedServiceTwo>();
在上面的示例中,调用了
StartAsync
上的HostedServiceOne
,但从未调用过StartAsync
上的HostedServiceTwo
。如果我交换注册IHostedService
的两个实现的顺序(将IHostedServiceTwo
放在IHostedServiceOne
之前),则将调用StartAsync
上的HostedServiceTwo
,但不会调用HostedServiceOne
。编辑:
我被引导到以下位置:
How to register multiple implementations of the same interface in Asp.Net Core?
但是,这不是
IHostedService
。要使用建议的方法,我必须对serviceProvider.GetServices<IService>();
进行调用,但似乎IHostedService.StartAsync
似乎在内部被调用。我什至不知道在哪里调用它来触发IHostedService.StartAsync
。 最佳答案
我有同样的问题。
必须在每个服务中返回Task.CompletedTask;
public class MyHostedService: IHostedService
{
public Task StartAsync(CancellationToken cancellationToken)
{
Task.Run(() => SomeInfinityProcess(cancellationToken));
return Task.CompletedTask;
}
public void SomeInfinityProcess(CancellationToken cancellationToken)
{
for (; ; )
{
Thread.Sleep(1000);
if (cancellationToken.IsCancellationRequested)
break;
}
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
Startup.cs是相同的:
services.AddHostedService<MyHostedService>();
services.AddHostedService<MyHostedService2>();
...
关于c# - IHostedService的多种实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52712347/