SignalR可以帮助这种情况 - 检测计划完成而不进行轮询吗?

时间:2013-04-20 22:16:26

标签: c# asp.net signalr

在我的网页上(在asp.net mvc3上编写),用户可以在ms sql数据库中创建一个计划,然后用户需要通知计划完成以及一些数据。

要检测计划完成(其唯一ID将在完成时从表中消失),目前我正在进行ajax轮询,然后执行额外的ajax调用以从数据库中获取结果数据。

使用SignalR可以改善这种情况吗?若然,怎么做?

2 个答案:

答案 0 :(得分:3)

  

使用SignalR可以改善这种情况吗?若然,怎么做?

绝对可以改进。目前我假设您正在进行Ajax轮询,而不知道何时需要刷新页面以显示计划完成的更新。使用SignalR实现,您将拥有一个使用集线器方法和客户端回调创建的服务器端集线器,以处理来自服务器集线器的回调。您不需要您的客户端轮询服务器以查看是否有任何更新。但有些你需要在服务器内部(可能是BG工作人员)内部建立一个轮询机制来检测计划完成(假设这是一个自动化活动)。 Signalr不会自动执行这些操作,您需要从服务器启动到客户端集线器订阅的呼叫。

就像您的场景的简单原型一样,您可以在服务器上创建一个Hub,仅为ex: -

ScheduleHub可能有2个函数,分别为CreateScheduleSetScheduleCompletion。 如果setScheduleCompletion知道

在客户端javascript上,您将获得hubConnection实例

 var scheduleCheckHub= $.connection.scheduleHub;
//when the use
    $("#createSchedule").click(function () {
                    scheduleCheckHub.server.createSchedule(somedata);
                });

客户端集线器方法回调以处理来自服务器的回调。

scheduleCheckHub.client.updateScheduleStatus = function (data) {
              //do something
            };

您将具有连接开始停止,重新连接逻辑等

 $.connection.hub.start().done(function () {
              //do something
            });
       .....

在您的服务器Hub SetScheduleCompletion方法

    public void SetScheduleCompletion()
   {
 .....
//some code that knows when the schedule has been completed.
//Now i know that this schedule has been completed so
//push this to all the clients, ok then make the call back to the client hub proxy method
      Clients.All.updateScheduleStatus(responseObject); 
//No i just want to send this to only specific clients. Ok then do this
   var subscribers = Clients.Group(someIdentifierToGetGroups);
   subscribers.updateScheduleStatus(responseObject);
}

根据应用程序的复杂性,事情可能会发生变化。这是一个非常简单的场景和实现。

答案 1 :(得分:1)

如果您使用SignalR,您的应用程序结构会略有变化。

例如,代替在客户端上进行ajax轮询,您可以让服务器轮询或在完成的日程表上以某种方式更新。

一旦SignalR知道计划完成,它就可以将数据下载到您的客户端,并提供有关计划完成的信息。