如何使用 .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;
}
}
我是 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;
}
}