如何使用 .Net Core SignalR 不断发送更新?

How to send constantly updates using .Net Core SignalR?

我是 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,当我创建一些循环动作时,它又会向客户端发送更新。如果这样的做法没问题,这个Broadcaster如何初始化?

目前我添加了这样的静态class:

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 末尾调用了这个方法,这里可能有很多违规行为,但到目前为止这是我最好的选择。

缺少的部分是托管服务,即在后台运行的代码 -- https://docs.microsoft.com/en-US/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-2.2

所以我的疯狂class现在变成了:

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;
    }
}