晚上好
在我的SignalR应用程序中,我有一个javascript计时器,它同时为所有用户运行。在此计时器结束时,将调用服务器功能,这就是问题开始的地方。 由于该函数在计时器末尾被调用,因此每个连接的用户都同时调用它,这是不必要的,因为它将为所有连接的用户返回相同的输出。作为逻辑上复杂的功能,让服务器不必要地为所有用户运行它加起来是极大的资源浪费。
如何使它只运行一次(也许是第一次调用(直到下一个定时器停止))?
提前谢谢
答案 0 :(得分:0)
您可以使用GlobalHost.ConnectionManager.GetHubContext
。这将允许您获取任何中心上下文,然后在该上下文上触发Clients.All.YourFunction
。这将向订阅该集线器的所有连接的客户端发送一条消息。
您将需要有一个后台进程在您的JavaScript函数启动时运行(顺便说一句,依靠所有客户端同时调用JavaScript函数确实不是一个好主意;不同的客户端位置和不同的机器性能将意味着它们不太可能同时发生。
以下内容假设您只是在单个服务器上运行它。如果要将其部署到Web场,则需要使用Database值来确保您不重复相同的工作,或者设置特定的服务器实例来负责调用(否则,最终将导致每个服务器只能打一个电话。
创建一个在后台运行的进程(我在这里坚持一个简单的线程,实际上我为此使用HangFire,但这足以满足示例要求),例如在App_Start上
Thread thread = new Thread(new ThreadStart(YourFunction));
thread.Start();
然后创建YourFunction
来负责您的客户呼叫:
private bool Cancel = false;
private void YourFunction()
{
do
{
string foo = "Foo";
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<YourHub>();
context.Clients.All.SendYourMessage(foo);
Thread.Sleep(10000);
}
while(!Cancel)
}
然后在客户端上,只需处理来自中心的消息:
youyHub.client.sendYourMessage = function(message)
{
// message == "Foo"
};