我是SignalR的新手,我想构建这样的应用程序-集线器每秒将当前时间发送给所有连接的客户端。
我找到了教程,但是它是针对.Net Framework(不是Core)的:https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/tutorial-high-frequency-realtime-with-signalr因此,一方面我不知道如何将其转换为.Net Core SignalR,另一方面,我不知道不知道如何从头开始编写它(限制条件是集线器是易失性实体,因此我无法在其中添加状态)。
我需要带有状态的静态(我想)-假设是Broadcaster,当我创建一些周期性的动作时,这些动作又会将更新发送给客户端。如果可以的话,如何初始化此广播器?
当前,我添加了此类静态类:
public static class CrazyBroadcaster
{
public static void Initialize(IServiceProvider serviceProvider)
{
var scope = serviceProvider.CreateScope();
var hub = scope.ServiceProvider.GetRequiredService<IHubContext<ChatHub>>();
var sub = Observable.Interval(TimeSpan.FromSeconds(1)).Subscribe(_ => hub.Clients.All.SendAsync("Bar", DateTimeOffset.UtcNow));
}
}
是的,我知道它是泄漏的。我在Startup.Configure
的结尾处调用了此方法,这里可能有大量的违规行为,但到目前为止,这是我的最佳选择。
答案 0 :(得分:0)
缺少的部分是托管服务,即在后台运行的代码-https://docs.microsoft.com/en-US/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-2.2。
所以我疯狂的课程现在变成了:
public sealed class HostedBroadcaster : IHostedService, IDisposable
{
private readonly IHubContext<ChatHub> hubContext;
private IDisposable subscription;
public HostedBroadcaster(IHubContext<ChatHub> hubContext)
{
this.hubContext = hubContext;
}
public void Dispose()
{
this.subscription?.Dispose();
}
public Task StartAsync(CancellationToken cancellationToken)
{
this.subscription = Observable.Interval(TimeSpan.FromSeconds(1)).Subscribe(_ => hubContext.Clients.All.SendAsync("Bar", DateTimeOffset.UtcNow));
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
this.subscription?.Dispose();
return Task.CompletedTask;
}
}