Как отправлять постоянно обновления с помощью .Net Core SignalR? - PullRequest
0 голосов
/ 28 мая 2019

Я новичок в 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?

В настоящее время я добавил такой статический класс:

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 голосов
/ 28 мая 2019

Недостающим был размещенный сервис, то есть код, который работает в фоновом режиме - 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;
    }
}
...