C# SignalR是否可以帮助此场景—在不轮询的情况下检测计划完成?

C# SignalR是否可以帮助此场景—在不轮询的情况下检测计划完成?,c#,asp.net,signalr,C#,Asp.net,Signalr,在我的网页上(写在asp.net mvc3上),用户可以在ms sql数据库中创建一个计划,然后需要通知用户计划完成情况以及由此产生的一些数据 为了检测计划的完成情况(完成时其唯一id将从表中消失),目前我正在进行ajax轮询,然后进行额外的ajax调用以从数据库中获取结果数据 使用signer是否可以改善这种情况?如果可以,如何改善?如果使用signer,应用程序的结构将略有改变 例如,与在客户机上进行ajax轮询不同,您可以让服务器轮询或以某种方式更新已完成的时间表 一旦SignalR知道某

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

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


使用signer是否可以改善这种情况?如果可以,如何改善?

如果使用signer,应用程序的结构将略有改变

例如,与在客户机上进行ajax轮询不同,您可以让服务器轮询或以某种方式更新已完成的时间表


一旦SignalR知道某个计划已完成,它就可以将数据向下推送到您的客户机,并提供有关计划完成的信息。

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

例如,与在客户机上进行ajax轮询不同,您可以让服务器轮询或以某种方式更新已完成的时间表

一旦SignalR知道计划已完成,它就可以将数据向下推送到您的客户机,并提供有关计划完成的信息

使用信号器可以改善这种情况吗?如果可以,如何改善

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

正如您的场景的简单原型一样,您可以在服务器上创建一个集线器,例如:-

ScheduleHub
,它可能有两个功能,即
CreateSchedule
SetScheduleCompletion
。 如果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
            });
       .....
在服务器集线器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);
}
同样,根据应用程序的复杂性,情况可能会发生变化。这是一个非常简单的场景和实现

使用信号器可以改善这种情况吗?如果可以,如何改善

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

正如您的场景的简单原型一样,您可以在服务器上创建一个集线器,例如:-

ScheduleHub
,它可能有两个功能,即
CreateSchedule
SetScheduleCompletion
。 如果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
            });
       .....
在服务器集线器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);
}

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

@Taylor感谢您的确认。我一直对投票感到不安,这将是一个令人兴奋的机会,让它变得更好!也许服务器可以使用sqldependency在计划完成时获得通知,获取数据,将数据推送到客户端。但不确定服务器是否可以锁定哪个客户端来获取数据,而不是广播。@Taylor感谢您的确认。我一直对投票感到不安,这将是一个令人兴奋的机会,让它变得更好!也许服务器可以使用sqldependency在计划完成时获得通知,获取数据,将数据推送到客户端。不确定服务器是否可以锁定哪个客户端来获取数据,而不是广播。感谢您的时间和示例,有时我会深入研究这种方法。感谢您的时间和示例,有时我会深入研究这种方法。