【问题标题】:Refreshing data periodically using SignalR rather than broadcasting to clients [closed]使用 SignalR 定期刷新数据,而不是向客户端广播 [关闭]
【发布时间】:2019-11-15 20:45:15
【问题描述】:

我在页面上显示一些数据,即 Sum、Average 和 Total,并希望在使用 SignalR 更改数据后更新它们。大多数示例使用以下方法,在执行创建/更新/删除方法(更改数据)后广播所有客户端:

private void BroadcastDataChange(Data data)
{
    Clients.All.dataChanged();
}

但是,我想知道是否有一种更智能的方法可以让我更新数据,即在每个 create-update-delete 方法中定期刷新而不广播(我不使用 SqlDependency 等,而是使用 SignalR)。另一方面,我不确定这种方法是否与 SignalR 逻辑相矛盾。这是我第一次使用 SİgnalR,我很困惑 :( 任何帮助将不胜感激。

【问题讨论】:

  • @Jack 你想做什么? SignalR 存在,因此浏览器不会 必须轮询服务器。否则他们可以只使用定时循环,这将导致数据库加载数据时受到打击,除非它被缓存。总体而言,复杂性增加了,数据库的负载也增加了。
  • @Jack SignalR 是向客户端发送信息的机制。这不是通用轮询、调度或发布/订阅机制。如果要轮询数据库以进行更改,请创建检查更改的计划作业、任务或计时器。找到这些后,可以使用 SignalR 将它们推送到所有客户端
  • @Jack 在这里查看关于 server-api(又名 SignalR Hub)的好文档:docs.microsoft.com/en-us/aspnet/core/signalr/…
  • @jack 客户端 API 是纯 JavaScript,因此它应该可以与 Angular 一起使用,但到目前为止我从未使用过 Angular。我认为 .Net(非核心)使用 SignalR V1 而不是新的 V2。不确定这一点,因为我只有核心。 V1 中的 API 与 V2 非常相似,我猜 V1 的文档仍然在线。您应该能够使 V2 样本适应 V1。
  • @Jack 关于轮询与推送。一般来说,如果您需要快速更新或拥有大量客户端,推送会更有效,因为数据仅在需要时传输。如果您没有很多客户,而且数据并不总是最新的,您也可以每分钟或每几分钟轮询一次。轮询可以使用 SignalR 或普通 AJAX 完成。轮询通常更容易实现,但不能很好地扩展。因此,“这取决于”您的需求,例如“有多少客户”以及“数据必须以多快的速度更新”。

标签: c# asp.net asp.net-mvc asp.net-core signalr


【解决方案1】:

您可以对 SignalR 使用轮询。不过,这只是一种低效的处理方式,因为:(1) 在更改发生与将其广播给客户端之间会有延迟。 (2) 数据不变化也会广播,浪费资源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2013-07-30
    相关资源
    最近更新 更多