【发布时间】:2020-09-25 21:38:29
【问题描述】:
我有一个客户端应用程序Angular 和一个signalR 集线器,还有一个将时间戳作为参数的服务。
当我按下客户端中的开始按钮时,我想在集线器中调用一个方法,当调用该方法时,我想继续列出所有更改(创建一个计时器),直到客户端按下停止按钮,然后我将停止计时器。
所以我想问哪个更好:
1- 从带有时间戳的客户端调用调用的方法,然后创建一个setInterval 来调用其中的方法,当按下停止按钮时我可以停止它。
优点: 启动和停止计时器很容易。
缺点: 我每 1 秒调用一次该方法,然后检查客户端是否有更新 UI 的响应。
2- 调用该方法一次,然后为服务器上的每个客户端创建一个计时器,当客户端按下停止按钮时,我可以调用另一个方法来停止该客户端的计时器。
优点: 我正在检查集线器中的时间戳,只有当来自服务的时间戳 > 本地时间戳时,我才会将数据发送到客户端
缺点: 我实际上不知道如何为每个客户创建一个计时器,所以如果这是正确的方法,请帮助我
【问题讨论】:
-
为什么要使用计时器?只需让客户端监听服务器通知。 SignalR 通过使用 websockets 向客户端推送通知来消除轮询的需要
-
我想每 1 秒获取一次数据,因此服务需要一个时间戳
-
这意味着服务器需要每1秒向客户端发送一次数据。这引出了一个问题,为什么 - 你在发送进度通知消息吗?或者只是时间,这是一种非常昂贵的方法?在短时间内,您可以使用
await Task.Delay(1000);在集线器上执行异步操作,并每 1 秒发送一次响应,或者可能。使用 Rx 源。对于较长的作业,您需要适当地处理它们,例如使用 BackgroundService,并每 1 秒调用一次集线器以发送通知 -
为什么需要每秒更新?如果您每秒发送更新并且如果没有更改则不显示任何内容与服务器仅在有更改时发送消息相同...
-
我有一项服务不会动态更改数据并且依赖于时间戳,因此要获取更新的数据,我需要每次调用该服务,然后检查时间戳是否更大,这就是为什么我每 1 秒发送一次请求,如果该方法有任何错误,请告诉我