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

时间:2019-05-28 09:38:59

标签: asp.net-core signalr-hub

我是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的结尾处调用了此方法,这里可能有大量的违规行为,但到目前为止,这是我的最佳选择。

1 个答案:

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