0

我们正在使用 SignalR 将消息从服​​务器推送到客户端。我们使用服务器广播的一些事情:

  • 实时通知
  • 更新共享数据的更改
  • 聊天类功能

我们的一位开发人员从 StockTicker 示例开始,我们将其扩展为推送我们所有不同的消息类型。这是我们的总体方案:

 private void RunJobs()
    {
        _jobs = GetAllJobs();
        while (true)
        {
            bool workDone = false;
            for (int i = 0; i < _jobs.Count; i++)
            {
                var j = _jobs.ElementAt(i);
                bool workToDo = j.MessageAvailable();
                workDone = workDone || workToDo;

                if (workToDo)
                {
                    var message = j.GetMessage();   
                    _threadPool.QueueWorkItem(ProcessJob, j, message);
                }
            }

            if (!workDone)
            {
                Thread.Sleep(_sleepTime);
            }

        }
    }

    /// <summary>
    /// Method called by threads to process queued up Work Item (ISignalRJob)
    /// </summary>
    /// <param name="job">Job to run.</param>
    private void ProcessJob(ISignalRJob job, QueueMessage message)
    {
        try
        {
            job.ProcessMessage(message);
        }
        catch (Exception e)
        {
            //handle exception
        }
    }

随着每个作业的处理,它执行如下操作:

protected override void ProcessMessage(QueueMessage message)
    {
        var nqm = JsonConvert.DeserializeObject<NotificationQueueMessage>(message.Body);

        var notification = webService.GetNotification(notification.Id);

        foreach(var userConnectionId in GetUserConnectionIds(nqm.UserId)){
             _signalRConnectionContext.Clients.Client(userConnectionId).pushNotification(notification);
        }

    }

在一个线程中,监视一系列消息队列。如果出现消息,则将消息从队列中弹出,并启动一个新线程来处理消息(ProcessJob)。然后,这些作业将执行构建客户端消息所需的任何服务调用/数据库调用,然后将消息推送到客户端。

该服务似乎可以工作,但客户端会定期停止接收消息,尽管我已经验证它们是从服务器发送的。是否有可能在多个线程中推送到客户端连接使其处于不良状态?

我是否应该将 QueueMessage 处理的结果返回给 SignalR 主线程,并同步返回它们?

4

0 回答 0