我正在尝试使用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/

10-12 03:40