Exemple #1
0
        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);
                }
            }
        }
Exemple #2
0
        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);
                }
            }
        }