【发布时间】:2021-10-01 15:29:59
【问题描述】:
我遇到了一个小问题,需要一些帮助。我尝试将 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;
}
}
}
【问题讨论】:
-
我们不能神奇地知道Service1和2在做什么,我们需要查看代码才能理解发生了什么。
-
你为什么要添加带有
services.AddSingleton的单例?services.AddHostedService一个人就够了 -
@CamiloTerevinto 抱歉,我认为没有必要将它们包括在内,因为我的问题更多是关于同时运行这两个服务,这似乎没有发生。
-
@abdusco 我将实例注入到我的一些 razor 页面中,以便访问公共属性以从服务中获取信息以显示在网页上。
-
您需要为我们确认StartAsync方法是否及时返回。
标签: c# asp.net-core .net-core blazor blazor-server-side