gpt4 book ai didi

javascript - Hub 方法仅运行一次

转载 作者:行者123 更新时间:2023-12-03 02:52:21 29 4
gpt4 key购买 nike

(我是 Signalr 新手)

我正在开发一个 Web 应用程序,它使用 Signalr-core 来实时更新页面。

我遇到的问题是,当我运行多个客户端时,我正在运行的方法将同时运行与客户端数量一样多的次数。

所以我想知道是否有任何方法可以让第一个客户端调用集线器方法,然后保持它运行并向所有连接的客户端广播。

这就是我正在为我的客户做的事情:

connection.on('update', (id, Color) => {
var x = document.getElementById(id);
if (Color === "green" && x.classList.contains("red"))
{
//console.log("green");
x.classList.remove("red");
x.classList.add("green");
}
else if (Color === "red" && x.classList.contains("green"))
{
//console.log("Red");
x.classList.remove("green");
x.classList.add("red");
}});

connection.start()
.then(() => connection.invoke('updateclient', updating));

这就是我正在用我的集线器做的事情:

 public void UpdateClient(bool updating)//this must run only once
{
while (updating == true)
{
Thread.Sleep(2000);
foreach (var item in _context.Devices)
{

IPHostEntry hostEntry = Dns.GetHostEntry(item.DeviceName);
IPAddress[] ips = hostEntry.AddressList;
foreach (IPAddress Ip in ips)
{
Ping MyPing = new Ping();

PingReply reply = MyPing.Send(Ip, 500);
if (reply.Status == IPStatus.Success)
{
Color = "green";
Clients.All.InvokeAsync("update", item.DeviceID, Color);

break;
}
else
{
Color = "red";
Clients.All.InvokeAsync("update", item.DeviceID, Color);
}
}

}

}
}

如果我有任何不清楚的地方,请告诉我。

提前谢谢您。

最佳答案

正如我在评论中提到的,您可以在任何客户端首次出现时调用 UpdateClient 方法。我想出的选项如下;

quite common对连接到集线器的客户端使用静态列表

 public static class UserHandler
{
public static List<string> UserList = new List<string>();
}

在您的集线器中,重写 OnConnected 和 OnDisconnected 方法以在列表中添加/删除客户端,并根据您的目的定义连接到集线器的第一个客户端。

public class MyHub : Hub
{
private static IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();

public override Task OnConnected()
{
//Here check the list if this is going to be our first client and if so call your method, next time because our list is filled your method won't be invoked.
if(UserHandler.UserList.Count==0)
UpdateClient(true);

UserHandler.UserList.Add(Context.ConnectionId)
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
UserHandler.UserList.RemoveAll(u => u.ConnectionId == Context.ConnectionId);
return base.OnDisconnected(stopCalled);
}
}

我没有考虑您的业务逻辑或您的需求,这只是一个一般想法。例如,您可能想要添加一些逻辑,以便当所有客户端都关闭时,您应该使用更新标志来停止 UpdateClient 内的循环。

关于javascript - Hub 方法仅运行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47790295/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com