2017-04-13 223 views
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> 

回答

2

我找到了解決此問題的解決方法。 我不知道如何描述它。

在Hub類文件中完成以下代碼更改。 「ServerStatisticsHub.cs」

Clients.Client(Context.ConnectionId).broadcastServerStatistics("{\"processor\":" + p + ", \"memory\":" + m + ", \"storage\":" + s + "}"); 

改變

Clients.All。

Clients.Client(Context.ConnectionId)。

+1

我真的不會說它是一種解決方法,這實際上是一個可能適當的解決方案。您的問題是由於您在客戶端連接時調用包含無限循環的函數所致。所以客戶端1連接 - >啓動無限循環。客戶端2連接 - >無限循環再次啓動。他們在不同的線程上運行,因此再次啓動它並不會殺死前一個線程。由於您不會以任何方式退出循環,因此每個新客戶端都會導致啓動一個新的無限循環,每個循環都會向每個其他客戶端廣播消息。 –

+0

那麼有沒有什麼解決方案可以在頁面重新加載時關閉無限循環? –

+0

就我個人而言,我不會爲每個新客戶啓動一個無限循環。爲什麼我說你做了什麼可能是一個可能的解決方案,因爲它可能是,在這種情況下,消息不需要被廣播到所有連接的客戶端。 –