繁体   English   中英

添加多个托管服务的问题

[英]Issue adding more than one hosted service

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM