我遇到了一个小问题,需要一些帮助。我有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
基类。