集线器方法仅 运行 一次
Hub Method only running once
(我是 Signalr 新手)
我正在开发一个使用 Signalr-core 实时更新页面的网络应用程序。
我遇到的问题是,当我 运行 多个客户端时,我 运行 宁会 运行 一次有多少客户端就执行多少次。
所以我想知道是否有任何方法可以让第一个客户端调用 hub 方法,然后保持它 运行ning 并广播到所有连接的客户端。
这就是我正在与我的客户一起做的事情:
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>();
}
在您的集线器中,覆盖 add/remove 客户端 to/from 列表的 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
内的循环。
(我是 Signalr 新手)
我正在开发一个使用 Signalr-core 实时更新页面的网络应用程序。
我遇到的问题是,当我 运行 多个客户端时,我 运行 宁会 运行 一次有多少客户端就执行多少次。
所以我想知道是否有任何方法可以让第一个客户端调用 hub 方法,然后保持它 运行ning 并广播到所有连接的客户端。
这就是我正在与我的客户一起做的事情:
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>();
}
在您的集线器中,覆盖 add/remove 客户端 to/from 列表的 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
内的循环。