首页 > 解决方案 > 添加多个托管服务的问题

问题描述

我遇到了一个小问题,可以使用一些帮助。我尝试将 2 个托管服务添加到我的 Blazor Server 应用程序中。这些都是长期运行的后台服务,它们创建 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 个服务?

谢谢您的帮助!

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

服务很大,所以我不想粘贴所有代码。基本上它们的要点是:

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

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

标签: c#asp.net-core.net-coreblazorblazor-server-side

解决方案


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

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

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

这适用于多种服务:

    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基类。哪个做上述但可能更好。


推荐阅读