1

我是 SignalR 的新手,正在尝试实现长期运行的结果池。我已将 JS 添加到我的 ASP.NET MVC 应用程序并创建了错误类。

JS

  <script type="text/javascript">
        var message= $.connection.messageHub;
        $(function () {
            message.addMessage = function (htmlstring) {            
                alert(htmlstring);
            };

            $.connection.hub.start(function () {
                message.longRunningMethod('@HttpContext.Current.Session.SessionID');
            });        
        });
    </script>

c# 代码

[HubName("messageHub")]
public class MessagesHub : Hub
{
public void longRunningMethod(string sessionId)
{
   var repeatChecking = 0;
   while (repeatChecking < 3000000)
       {
          Caller.addMessage("Test");
          repeatChecking++;
          Thread.Sleep(TimeSpan.FromSeconds(1));                        
       }
}
}

代码工作正常,但有一个问题。每次同一用户刷新网页时,都会创建新的 Hub 类并执行新的 longRunningMethod 方法。我想恢复连接并附加到同一个集线器实例并恢复接收消息。谁能解释如何实现这一点?

4

1 回答 1

3

集线器的创建和销毁非常频繁,因此永远不要将您希望持续的任何数据放在它们上(除非它是静态的)。

我不太确定您为什么要寻找一种可以接收数据的长时间运行的方法(因为 SignalR 始终处于启动状态并且可以接收/处理数据),但您可以这样做:

查看 SignalR 股票代码示例(您可以通过 Nuget 获取)。它创建一个触发计时器的单个实例类。该计时器用于将数据向下广播到客户端。https://github.com/SignalR/SignalR-StockTicker

您还可以查看 ShootR。这是一款使用 SignalR 构建的多人游戏,具有很多相同的功能。创建一个后台计时器,充当服务器上的游戏循环,然后将数据向下推送到客户端。https://github.com/NTaylorMullen/ShootR

最终,您的解决方案将涉及制作单例或静态计时器作为您的“长时间”运行方法。

希望这可以帮助!

于 2012-10-12T17:45:57.183 回答