添加多个托管服务的问题

Issue adding more than one hosted service

我 运行 遇到了一个小问题,需要一些帮助。我有 2 个托管服务要添加到我的 Blazor Server 应用程序中。这些都是 long-运行ning 后台服务,它们创建 websocket 连接并保持打开状态以接收数据。问题是只有第一个服务正在启动。第二个服务确实启动了,但只是在我关闭应用程序时启动了一小段时间,并且在最后一秒短暂地闪烁了几条日志消息。两种服务都有 StartAsync 和 StopAsync。

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        })
        .ConfigureServices(services =>
        {
            services.AddHostedService<Service1>();
            services.AddSingleton<Service1>(p => p.GetServices<IHostedService>().OfType<Service1>().Single());
            services.AddHostedService<Service2>();
            services.AddSingleton<Service2>(p => p.GetServices<IHostedService>().OfType<Service2>().Single());
        });

不确定我在这里做错了什么,或者不可能同时有 2 个服务 运行ning?

感谢您的帮助!

编辑: 我正在使用 AddSingleton,因为我将实例注入我的一些网页以访问我在服务中设置的 public 属性,以便数据可以显示在网页上。

服务比较大,不想把所有代码都贴出来。基本上它们的要点是:

public Task StartAsync(CancellationToken cancellationToken)
{
    //Connect to websocket streams and handle incoming data

    while (true)
    {
        if (cancellationToken.IsCancellationRequested)
        {
            return Task.CompletedTask;
        }
    }
}

不支持 while(true) {...} 模式。

您将必须启动计时器、线程或长时间运行的任务。

StartAsync 必须return 快速,服务按顺序启动。

这适用于多个服务:

    public Task StartAsync(CancellationToken cancellationToken)
    {
        Task.Run(Forever);  // dont pass the cancellationToken
        return Task.CompletedTask;
    }

    private async Task Forever()
    {
        while (true)
        {
            await Task.Delay(5_000);
        }
    }

    public async Task StopAsync(CancellationToken cancellationToken)
    {                    
    }

或查找 BackgroundService 基数 class。哪一个能做到以上但可能更好。