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