添加多个托管服务的问题
Issue adding more than one hosted service
我 运行 遇到了一个小问题,需要一些帮助。我有 2 个托管服务要添加到我的 Blazor Server 应用程序中。这些都是 long-运行ning 后台服务,它们创建 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 个服务 运行ning?
感谢您的帮助!
编辑:
我正在使用 AddSingleton,因为我将实例注入我的一些网页以访问我在服务中设置的 public 属性,以便数据可以显示在网页上。
服务比较大,不想把所有代码都贴出来。基本上它们的要点是:
public Task StartAsync(CancellationToken cancellationToken)
{
//Connect to websocket streams and handle incoming data
while (true)
{
if (cancellationToken.IsCancellationRequested)
{
return Task.CompletedTask;
}
}
}
不支持 while(true) {...}
模式。
您将必须启动计时器、线程或长时间运行的任务。
StartAsync 必须return 快速,服务按顺序启动。
这适用于多个服务:
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
基数 class。哪一个能做到以上但可能更好。
我 运行 遇到了一个小问题,需要一些帮助。我有 2 个托管服务要添加到我的 Blazor Server 应用程序中。这些都是 long-运行ning 后台服务,它们创建 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 个服务 运行ning?
感谢您的帮助!
编辑: 我正在使用 AddSingleton,因为我将实例注入我的一些网页以访问我在服务中设置的 public 属性,以便数据可以显示在网页上。
服务比较大,不想把所有代码都贴出来。基本上它们的要点是:
public Task StartAsync(CancellationToken cancellationToken)
{
//Connect to websocket streams and handle incoming data
while (true)
{
if (cancellationToken.IsCancellationRequested)
{
return Task.CompletedTask;
}
}
}
不支持 while(true) {...}
模式。
您将必须启动计时器、线程或长时间运行的任务。
StartAsync 必须return 快速,服务按顺序启动。
这适用于多个服务:
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
基数 class。哪一个能做到以上但可能更好。