[英]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.