通过Hub方法触发的自定义功能进行SignalR Hub广播

时间:2019-06-17 14:06:23

标签: c# multithreading asp.net-core signalr signalr-hub

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

除了用户连接和断开连接时偶尔会出现“集线器已放置”异常(除了客户端号从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方法启动线程时,我不确定如何在此处使用它。有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

研究完StockTicker应用程序后,我可以通过创建其他类来解决我的问题,该类可以处理长时间运行的过程(将数据从IoT中心广播到所有连接的客户端)。如果有人遇到这样的问题,我将发布经过编辑的代码。 谢谢@Glen Ferrie