4
我想在使用SignalR的客戶端上顯示一些實時隨機數據。SignalR頁面刷新使多重連接
問題無論何時刷新頁面,它都會創建一個連接 並顯示多個數據。
大多數情況下,我認爲我的方法是錯誤的。
所以我做了什麼。
步驟1:安裝SignalR
步驟2使用的NuGet Install-Package Microsoft.AspNet.SignalR
:在Startup.cs文件所做的更改如下。
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
app.MapSignalR(); //Added this line for SignalR
}
}
第3步:創建集線器類。 「ServerStatisticsHub.cs」
public class ServerStatisticsHub : Hub
{
public void ServerParameter()
{
Random r = new Random();
int p = 0;
int m = 0;
int s = 0;
while(true) //May be this is the foolish thing I'm doing
{
p = r.Next(0, 100);
m = r.Next(0, 100);
s = r.Next(0, 100);
Clients.All.broadcastServerStatistics("{\"processor\":" + p + ", \"memory\":" + m + ", \"storage\":" + s + "}");
System.Threading.Thread.Sleep(2000);
}
}
}
第4步:在主頁「ServerState.cshtml」中創建一個視圖。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<title>TestSignalR</title>
</head>
<body>
<div id="serverProcessor"></div>
<div id="serverMemory"></div>
<div id="serverStorage"></div>
<script src="@Url.Content("~/Scripts/jquery-2.2.3.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.signalR-2.2.1.min.js")"></script>
<script src="@Url.Content("~/signalr/hubs")"></script>
<script>
$(function() {
// Reference the auto-generated proxy for the hub.
var serverStatistics = $.connection.serverStatisticsHub;
// Create a function that the hub can call back to display messages.
serverStatistics.client.broadcastServerStatistics = function (serverStat) {
var serverStatistic = JSON.parse(serverStat);
console.log(serverStatistic);
$('#serverProcessor').html(serverStatistic.processor + "%");
$('#serverMemory').html(serverStatistic.memory + "%");
$('#serverStorage').html(serverStatistic.storage + "%");
};
// Start the connection.
$.connection.hub.start().done(function() {
serverStatistics.server.serverParameter();
});
});
</script>
</body>
</html>
我真的不會說它是一種解決方法,這實際上是一個可能適當的解決方案。您的問題是由於您在客戶端連接時調用包含無限循環的函數所致。所以客戶端1連接 - >啓動無限循環。客戶端2連接 - >無限循環再次啓動。他們在不同的線程上運行,因此再次啓動它並不會殺死前一個線程。由於您不會以任何方式退出循環,因此每個新客戶端都會導致啓動一個新的無限循環,每個循環都會向每個其他客戶端廣播消息。 –
那麼有沒有什麼解決方案可以在頁面重新加載時關閉無限循環? –
就我個人而言,我不會爲每個新客戶啓動一個無限循環。爲什麼我說你做了什麼可能是一個可能的解決方案,因爲它可能是,在這種情況下,消息不需要被廣播到所有連接的客戶端。 –