c# - 添加多个托管服务的问题
问题描述
我遇到了一个小问题,可以使用一些帮助。我尝试将 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;
}
}
}
解决方案
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
基类。哪个做上述但可能更好。
推荐阅读
- r - 在 R 中查找每个分组的新观察值
- android - 如何从火力基地取消身份验证禁用帐户?
- google-cloud-platform - Google 的 API Gateway 和 Cloud Endpoints 之间的区别
- sql - 查询根据时间间隔计算总和
- django - django 详细视图的页面查看次数
- c++ - FLite 不会从文件/festvox 存储库中加载语音
- spring - JPA,Hibernate:在现有的工作 DTO 中添加新变量时“无法在类上找到适当的构造函数”
- sql - 使用 python3 执行 .sql 脚本
- python - 如何将 N 个二维数组堆叠在一起作为图像
- c# - AWS S3:通过 Content-Disposition 标头而不是对象键前缀使用一组覆盖文件下载名称