public void ReceiveMessage(Message message)
        {
            ASSERT( message != null, "Missing parameter 'message'" );
            LOG( "ReceiveMessage(" + message + ") - Start" );
            #if DEBUG
                MessageReceived = true;
            #endif

            if( Router != null )
            {
                var triggerMessageKeys = Router.TriggerMessageKeys;
                var n = triggerMessageKeys.Length;
                for( int i=0; i<n; ++i )
                {
                    var triggerKey = triggerMessageKeys[ i ];
                    if( message.ContainsKey(triggerKey) )
                    {
                        LOG( "ReceiveMessage(" + message + ") - Invoke router for this message" );
                        Router.ReceiveTriggeredMessageFromConnection( message );
                        LOG( "ReceiveMessage(" + message + ") - Router returned" );
                        goto EXIT;
                    }
                }
            }

            CallbackItem callbackItem;
            if(! HandlerCallbacks.TryGetValue(message.HandlerType, out callbackItem) )
                throw new NotImplementedException( "There is no message handler defined for messages of type '" + message.HandlerType + "'" );

            var messageContext = new MessageContext( this, callbackItem, message );
            if(! callbackItem.IsThreaded )
            {
                // Process message right now
                HandleMessageThread( messageContext, /*taskEntry=*/null );
            }
            else
            {
                // Handle the message inside its own thread
                TaskQueue.CreateTask( (taskEntry)=>{ HandleMessageThread(messageContext, taskEntry); } );
            }

            EXIT:
            LOG( "ReceiveMessage(" + message + ") - Exit" );
        }