/// <summary>
        ///     Process and dispatch a message to registered functions for this message type.
        /// </summary>
        /// <param name="streamMessage"></param>
        /// <returns></returns>
        public async Task Visit(IStreamMessage streamMessage)
        {
            CombinedMessage combinedMessage = streamMessage as CombinedMessage;;

            if (combinedMessage != null)
            {
                foreach (var message in combinedMessage.Messages)
                {
                    await Visit(message);
                }

                return;
            }

            List <dynamic> funcList;

            _callbacks.TryGetValue(streamMessage.GetType(), out funcList);

            if (funcList != null)
            {
                foreach (var func in funcList)
                {
                    if (_logger != null && _logger.IsInfo)
                    {
                        _logger.Info("Dispatching message of type {0}", streamMessage.GetType().FullName);
                    }
                    await func(streamMessage as dynamic);

                    if (PostProcessedMessageFunc != null)
                    {
                        await PostProcessedMessageFunc();
                    }
                }
            }
        }
 private void FlushQueue()
 {
     if (_messages.Count > 0)
     {
         var combinedMessage = new CombinedMessage(_messages.ToList());
         _messages.Clear();
         _awaitedSends.Add(SendMessage(combinedMessage, false));
     }
 }