我是SignalR的新手并试图实现长时间运行的结果池。我已将JS添加到我的ASP.NET MVC应用程序并创建了bug类。
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#code
[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方法。我想恢复连接并连接到同一个集线器实例并继续接收消息。任何人都可以解释如何实现这个吗?
答案 0 :(得分:3)
非常频繁地创建和销毁集线器,因此永远不要放置任何您希望持续存在的数据(除非它是静态的)。
我不太确定你为什么要使用一个可以接收数据的长时间运行方法(因为SignalR总是处于启动状态并且可以接收/处理数据)但是你可以这样做:
查看SignalR股票代码示例(您可以通过Nuget将其拉入)。它创建一个单个实例类来启动计时器。该计时器用于向客户端广播数据。 https://github.com/SignalR/SignalR-StockTicker
您还可以查看ShootR。这是一款使用SignalR构建的多人游戏,其功能大致相同。创建一个后台计时器,充当服务器上的游戏循环,然后将数据向下推送到客户端。 https://github.com/NTaylorMullen/ShootR
最终,您的解决方案将涉及制作单件或静态计时器,作为“长期”运行方法。
希望这有帮助!