从中心方法触发的自定义函数的 SignalR 中心广播



在这种情况下,如何为长时间运行的进程运行 SignalR 中心?我想将数据从异步 IoT 中心接收器广播到连接到中心的所有客户端,但我只想运行 1 个线程并发送数据(IoT 中心限制 5 个侦听器(。

此代码工作并很好地完成工作,除了在用户连接和断开连接时偶尔出现"Hub 已释放"异常(当客户端编号从 1 更改为 0 或 0 更改为 1 时会发生错误 - 即线程启动和停止时(

    public override Task OnDisconnectedAsync(Exception exception)
    {
        if (UserHandler.ConnectedIds.Count)
        {
            UserHandler.Remove(Context.ConnectionId);
            numberOfUsers = UserHandler.ConnectedIds.Count;
        }
        else
        {
            UserHandler.Remove(Context.ConnectionId);
        }
        return base.OnDisconnectedAsync(exception);
    }
    public override Task OnConnectedAsync()
    {
        UserHandler.ConnectedIds.Add(UserHandler.Create(Context.ConnectionId, "connectionString"));
        System.Diagnostics.Trace.WriteLine("User connected!");
        return base.OnConnectedAsync();
    }
    public void Send()
    {
        if (UserHandler.ConnectedIds.Count==1)
        {
            thread = new Thread(() => SendMessage());
            thread.Start();
        }
    }
    public void SendMessage()
    {
        while (UserHandler.ConnectedIds.Count > 0)
        {
            Task<string> getData = recieveFromDevice.ReceiveMessagesFromDeviceAsync(eventHubReceiver, "3");
            var receivedList = JsonConvert.DeserializeObject<List<Variable>>(getData.Result);
                if (UserHandler.ConnectedIds.Count != 0)
                {
                    Clients.All.SendAsync("Send", receivedList);
                }
            }
        }
    }

我已经阅读了有关使用 Hub 上下文的文档,但是当我从 Hub 方法启动线程时,我不确定如何在此处执行此操作。有没有更好的方法可以做到这一点?

在查看了 StockTicker 应用程序后,我能够通过创建处理长时间运行过程(将数据从 IoT 中心广播到所有连接的客户端(的其他类来解决我的问题。如果有人遇到这样的问题,我将发布编辑后的代码。谢谢@Glen费里

最新更新