internal static void ReceiveMessage(IAsyncResult ar) { Message m = null; Connection connection = null; try { m = Message.EndReceive(out connection, ar); } catch (MessageException e) { TriggerException(e); return; } lock (_listenersLockObject) { if (!_listeners.ContainsKey(m.Guid)) { // New incoming message if (_listeners.ContainsKey(connection.LocalChannelID)) { AsyncResult myAr = _listeners[connection.LocalChannelID]; _listeners.Remove(connection.LocalChannelID); myAr.Complete(connection, m); } else if (_listeners.ContainsKey(connection.LocalAddress)) { AsyncResult myAr = _listeners[connection.LocalAddress]; _listeners.Remove(connection.LocalAddress); myAr.Complete(connection, m); } else { // add incoming message to the pending messages var key = connection.LocalChannelID; Queue <ConnectionAndMessage> queue; if (!pendingMessages.TryGetValue(key, out queue)) { queue = new Queue <ConnectionAndMessage>(); pendingMessages.Add(key, queue); } queue.Enqueue(new ConnectionAndMessage { Connection = connection, Message = m }); } } else { // Response to previous message AsyncResult myAr = _listeners[m.Guid]; _listeners.Remove(m.Guid); myAr.Complete(connection, m); } } }
internal static void ReceiveMessage(IAsyncResult ar) { Message m = null; Connection connection = null; try { m = Message.EndReceive(out connection, ar); } catch (MessageException e) { TriggerException(e); return; } lock (_listenersLockObject) { if (!_listeners.Contains(m.Guid)) { // New incoming message if (_listeners.Contains(connection.LocalChannelID)) { AsyncResult myAr = (AsyncResult)_listeners[connection.LocalChannelID]; _listeners.Remove(connection.LocalChannelID); myAr.Complete(connection, m); } else if (_listeners.Contains(connection.LocalAddress)) { AsyncResult myAr = (AsyncResult)_listeners[connection.LocalAddress]; _listeners.Remove(connection.LocalAddress); myAr.Complete(connection, m); } else { Stack outstanding = (Stack)outstandingMessages[connection.LocalAddress]; if (outstanding == null) { outstanding = new Stack(); outstandingMessages.Add(connection.LocalAddress, outstanding); } outstanding.Push(new Object[] { connection, m }); } } else { // Response to previous message AsyncResult myAr = (AsyncResult)_listeners[m.Guid]; _listeners.Remove(m.Guid); myAr.Complete(connection, m); } } }