Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Signalr 信令上下文线程安全_Signalr - Fatal编程技术网

Signalr 信令上下文线程安全

Signalr 信令上下文线程安全,signalr,Signalr,我们正在使用信号器将消息从服务器推送到客户端。我们使用服务器广播的一些功能: 实时通知 更新共享数据的更改 聊天功能 我们的一个开发人员从StockTicker示例开始,我们将其扩展为推送所有不同的消息类型。以下是我们的总体方案: private void RunJobs() { _jobs = GetAllJobs(); while (true) { bool workDone = false;

我们正在使用信号器将消息从服务器推送到客户端。我们使用服务器广播的一些功能:

  • 实时通知
  • 更新共享数据的更改
  • 聊天功能
我们的一个开发人员从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
        }
    }
private void RunJobs()
{
_jobs=GetAllJobs();
while(true)
{
bool-workDone=false;
对于(int i=0;i<\u jobs.Count;i++)
{
var j=_jobs.ElementAt(i);
bool workToDo=j.MessageAvailable();
workDone=workDone | | workToDo;
if(工作待办事项)
{
var message=j.GetMessage();
_QueueWorkItem(ProcessJob,j,message);
}
}
如果(!workOne)
{
线程。睡眠(_sleepTime);
}
}
}
/// 
///线程调用的方法来处理排队的工作项(ISignalRJob)
/// 
///要运行的作业。
私有void ProcessJob(ISignalRJob作业,QueueMessage消息)
{
尝试
{
job.ProcessMessage(message);
}
捕获(例外e)
{
//处理异常
}
}
在每个作业处理过程中,它执行如下操作:

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);
        }

    }
protected override void ProcessMessage(队列消息)
{
var nqm=JsonConvert.DeserializeObject(message.Body);
var notification=webService.GetNotification(notification.Id);
foreach(getUserConnectionId(nqm.UserId)中的var userConnectionId){
_signalRConnectionContext.Clients.Client(userConnectionId).pushNotification(通知);
}
}
在线程中,监视消息的一系列队列。如果出现消息,请将消息从队列中弹出,并启动一个新线程来处理该消息(ProcessJob)。然后,作业将执行构建客户机消息所需的任何服务调用/db调用,然后将消息推送到客户机

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


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

当您说您已验证消息是否已从服务器发送时,您是否已验证消息是否已通过线路发送,或者只是确保
客户端(userConnectionId).pushNotification(notification)
已调用?我已验证它们是否已从服务器中推送。我还没有证实他们是通过电线出来的。有日志可以让我看吗?通过Chrome开发工具中的“网络”选项卡可以看到它吗?它是线程安全的,所以这不是问题。谢谢dfowler,我们会继续查找。