【问题标题】:ASP.NET Dynamic SignalR Hubs? groups?ASP.NET 动态 SignalR 集线器?团体?
【发布时间】:2018-05-06 01:19:00
【问题描述】:

我有网络控件(仪表),我根据页面加载时的作业设置动态创建 1 到 x(最多 30 个)。 SignalR Hub 代码位于每 20 秒触发一次的计时器上。这样,我的动态仪表每 30 秒获取一次数据。我正在使用客户端 javascript 函数 guage.set_vale() 设置控件的值。当集线器触发并设置值时,此函数每 30 秒循环一次。

   For i As Integer = 0 To 7
        Dim UserControl As WebUserControl1 = CType(Me.LoadControl("~/WebUserControl1.ascx"), WebUserControl1)
        UserControl.ID = "RG" & (i)  ''1_RadGauge

        UserControl.ControlWidth = 9
        UserControl.setTankNumber = i + 20
        Me.Panel1.Controls.Add(UserControl)

    Next

目前,所有控件都从同一个 HUB 获取数据。为这些控件提供数据的是服务器端的 SQL 数据库。

SELECT top(1) * from zSignalR_DB_Test order by id desc

所以所有控件都显示相同的数据。 我想要做的是让每个控件显示其数据。所以每个控件都会从数据库中获取自己的数据

    SELECT top(1) * from zSignalR_DB_Test WHERE ID = 'MyControlID' order by id desc

我查看了 SignalR Groups,但还没有看到如何做我想做的事情。这样,我需要做的就是将 controlID 与数据库中的数据关联起来。

我的问题是:

我是否需要为我动态创建的每个控件使用单独的 SignalR Hub?

我需要动态创建这些集线器吗?

SignalR Groups 是正确的做法吗?

如果我只每 30 秒或一分钟更新一次,我是否可以不只是创建一个从客户端发回 ID 的方法,并且当我循环遍历客户端中的每个控件时(可能添加 1 秒的暂停)发送 ID运行不同的 SQL 语句?

任何想法或例子都会很棒。

更多代码:

  <script type="text/javascript">
  $(function() {
        var logger = $.connection.loghub;
        logger.client.logMessage = function(msg) { 

            var ajaxPanel = document.getElementById("Panel1");  
            for (var x = 0; x < ajaxPanel.children.length; x=x+2) {  

                if (msg <=50){
                    var ImageElementGreen = ajaxPanel.children[x].children[0];
                    ImageElementGreen.style.visibility = 'visible'
                    var ImageElementRed = ajaxPanel.children[x].children[1];
                    ImageElementRed.style.visibility = 'hidden'
                } else {
                    var ImageElementGreen = ajaxPanel.children[x].children[0];
                    ImageElementGreen.style.visibility = 'hidden'
                    var ImageElementRed = ajaxPanel.children[x].children[1];
                    ImageElementRed.style.visibility = 'visible'
               }

                var TBValueElement = ajaxPanel.children[x].children[3].children[0];
                var TBValue = $find(TBValueElement.id);
                TBValue.set_value(msg + "%");

                var linearGaugeElement = ajaxPanel.children[x].children[4];
                var linearGauge = $find(linearGaugeElement.id);                           
                linearGauge.set_value(msg);  
            }
        };
        $.connection.hub.start();
    });     
</script>

【问题讨论】:

    标签: asp.net signalr


    【解决方案1】:

    在 SignalIR 示例中,声明为 .. “一旦服务器启动并连接客户端,从一个客户端发送的消息将出现在所有连接的客户端中”,您只需将单个客户端数据定向到正确的 UI 控件或“仪表”。创建一个类来存储、格式化和访问您的数据。

    话虽如此,SignalIR 是基于 WebSocket(s),这是一个可爱的异步“实时”服务。 Websockets 不受 .Net 实现的限制,即使是 arduino 也可以配置为客户端或服务器。

    如果使用 websocket 路由,创建一些 javascript 以在 .. 时触发。

    ws.onmessage = function(e){
      var msg = "";
      var commandstring = "";
      var loadstring = "";
      if(e.data instanceof ArrayBuffer){
        msg = "BIN:";
        var bytes = new Uint8Array(e.data);
        for (var i = 0; i < bytes.length; i++) {
          msg += String.fromCharCode(bytes[i]);
        }
      } 
      else
      {
       msg = e.data;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-09
      • 1970-01-01
      相关资源
      最近更新 更多