protected void parseDataInternal(byte[] data, RemoteEndpoint endpoint) { QueueMessageRaw message = new QueueMessageRaw(); message.data = data; message.endpoint = endpoint; lock (recvRawQueueMessages) { recvRawQueueMessages.Add(message); } }
// Parse thread protected void parseLoop() { // Prepare an special message object to use while sending, without locking up the queue messages QueueMessageRaw active_message = new QueueMessageRaw(); while (running) { TLC.Report(); try { bool message_found = false; lock (recvRawQueueMessages) { if (recvRawQueueMessages.Count > 0) { // Pick the oldest message QueueMessageRaw candidate = recvRawQueueMessages[0]; active_message.data = candidate.data; active_message.endpoint = candidate.endpoint; // Remove it from the queue recvRawQueueMessages.Remove(candidate); message_found = true; } } if (message_found) { // Active message set, add it to Network Queue CoreProtocolMessage.readProtocolMessage(active_message.data, this); } else { Thread.Sleep(10); } } catch (Exception e) { Logging.error(String.Format("Exception occured for client {0} in parseLoopRE: {1} ", getFullAddress(), e)); } // Sleep a bit to prevent cpu waste Thread.Yield(); } }