private void SendOrEnqueue(TerrainMessageResponse response) { lock (SendQueue) { SendQueue.Enqueue(response); } //caso não esteja esperando nada atualiza fila enviando o ultimo adicionado if (!WaitingResponse) { UpdateQueue(); } }
private void UpdateQueue() { TerrainMessageResponse nextResponse = null; lock (SendQueue) { try { //verifica proximo item da fila nextResponse = SendQueue.Dequeue(); } catch (Exception) { } } //nada na fila para enviar if (nextResponse == null) { //marca que não esta aguardando resposta WaitingResponse = false; LastSend = DateTime.MinValue; return; } //envia e aguarda resposta com dados de chunk Send(nextResponse.Serialize()); if (nextResponse.Type == TerrainMessageType.SucessReceived) { //caso seja mensagem de recebido com sucesso faz a fila de envio andar System.Threading.Thread.Sleep(15);//aguarda 15ms para não gerar envios rapidamente seguidos WaitingResponse = false; LastSend = DateTime.MinValue; UpdateQueue(); return; } //marca que esta aguardando resposta WaitingResponse = true; LastSend = DateTime.Now; }