Exemplo n.º 1
0
        private void SendOrEnqueue(TerrainMessageResponse response)
        {
            var connectionResponses = SendQueue.GetOrAdd(response.ConnectionID, new Queue <TerrainMessageResponse>());

            lock (connectionResponses)
            {
                connectionResponses.Enqueue(response);
            }
            //caso não esteja esperando nada atualiza fila enviando o ultimo adicionado
            bool waitingResponse = WaitingResponse.GetOrAdd(response.ConnectionID, false);

            if (!waitingResponse)
            {
                UpdateQueue(response.ConnectionID, false);
            }
        }
Exemplo n.º 2
0
        private void UpdateQueue(int connectionID, bool forwardQueue)
        {
            var connectionResponses             = SendQueue.GetOrAdd(connectionID, new Queue <TerrainMessageResponse>());
            TerrainMessageResponse nextResponse = null;

            lock (connectionResponses)
            {
                if (forwardQueue)//passa para o proximo item elimando o mais antigo
                {
                    connectionResponses.Dequeue();
                }

                try
                {
                    //verifica proximo item da fila
                    nextResponse = connectionResponses.Peek();
                }
                catch (Exception) { }
            }

            //nada na fila para enviar
            if (nextResponse == null)
            {
                //marca que não esta aguardando resposta
                WaitingResponse.AddOrUpdate(connectionID, false, (id, actual) =>
                {
                    return(false);
                });
                return;
            }
            //envia e aguarda resposta de chunk/block carregado
            Send(nextResponse.ConnectionID, nextResponse.Serialize());
            //marca que esta aguardando resposta
            WaitingResponse.AddOrUpdate(connectionID, true, (id, actual) =>
            {
                return(true);
            });
        }
 public byte[] Serialize()
 {
     return(TerrainMessageResponse.Serialize(this.Type, this.Content));
 }