public IAsyncResult BeginRequest(Message message, TimeSpan timeout, AsyncCallback callback, object state)
        {
            base.ThrowIfDisposedOrNotOpen();
            base.RemoteAddress.ApplyTo(message);

            var request = new Common.AsyncRequestContext(message, timeout, callback, state);
            DispatchToListener(request);
            base.PendingRequests.Add(request);
            return request;
        }     
        public IAsyncResult BeginRequest(Message message, TimeSpan timeout, AsyncCallback callback, object state)
        {
            base.ThrowIfDisposedOrNotOpen();
            base.RemoteAddress.ApplyTo(message);

            var request = new Common.AsyncRequestContext(message, timeout, callback, state);

            DispatchToListener(request);
            base.PendingRequests.Add(request);
            return(request);
        }
        public virtual Message Request(Message message, TimeSpan timeout)
        {
            base.ThrowIfDisposedOrNotOpen();
            base.RemoteAddress.ApplyTo(message);

            var request = new Common.AsyncRequestContext(message, timeout);
            base.PendingRequests.Add(request);

            try
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(DispatchToListener), request); 
                //this.DispatchToListener(request);
                return request.WaitForReply();
            }
            finally
            {
                base.PendingRequests.Close(request);
            }
        }
        public virtual Message Request(Message message, TimeSpan timeout)
        {
            base.ThrowIfDisposedOrNotOpen();
            base.RemoteAddress.ApplyTo(message);

            var request = new Common.AsyncRequestContext(message, timeout);

            base.PendingRequests.Add(request);

            try
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(DispatchToListener), request);
                //this.DispatchToListener(request);
                return(request.WaitForReply());
            }
            finally
            {
                base.PendingRequests.Close(request);
            }
        }