c# - IHostedService 的多种实现

标签 c# asp.net-core asp.net-core-2.0

我正在尝试使用 IHostedService 创建后台服务。如果我只有一个后台服务,一切都很好。当我尝试创建多个 IHostedService 的实现时只有最先注册的才真正运行。

services.AddSingleton<IHostedService, HostedServiceOne>();
services.AddSingleton<IHostedService, HostedServiceTwo>();

在上面的示例中 StartAsyncHostedServiceOne被叫但是StartAsyncHostedServiceTwo永远不会被调用。如果我交换注册 IHostedService 的两个实现的顺序(将 IHostedServiceTwo 放在 IHostedServiceOne 之前)然后 StartAsyncHostedServiceTwo被调用但从来没有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/

相关文章:

c# - 用空格分割文本

c# - 如何在按钮单击事件上将数据从数据 GridView 加载到单独的窗口窗体?

c# - 如何在游戏中拥有局部位置和全局位置

visual-studio - CreateAppHost 任务意外失败。 MSB4018

transactions - 如何在asp.net-core 2.0中进行交易?

c# - 推荐用于在 C# 中处理 xml 配置文件的类?

c# - ASP.NET Core 解析 DbContext 依赖以初始化迁移

asp.net-core - 使用 AspNet [FromQuery] 模型绑定(bind)中的 EnumMember 值反序列化枚举

Redis - StackExchange.Redis - 使用 C# 驱动程序进行批量插入时缺少键

c# - 如何从 ActionFilterAttribute 访问 AppSettings