internal virtual IPCDispatchResult DoDispatchSyncMessage(IPCBaseSyncMessage message, IPCBaseMessagesQueue receaverQueue)
        {
            // ensure that IPC server is alive
            if (!ChannelServices.RegisteredChannels.Any(i => i.ChannelName == _dispatcherID.Value))
            {
                serverChannel = new IpcServerChannel(_dispatcherID.Value, _dispatcherID.Value);
                if (!ChannelServices.RegisteredChannels.Any(i => i == serverChannel))
                {
                    ChannelServices.RegisterChannel(serverChannel, false);
                }
            }

            // share object
            RemotingServices.Marshal(message,
                                     message.UriSuffix,
                                     message.GetType());
            try {
                // notify receaver
                IIPCGUID             helperID      = new IPCGUID(message.GetHashCode());
                IPCSyncHelperMessage helperMessage = new IPCSyncHelperMessage(new IPCUri(_dispatcherID, message).Value, message.GetType(), helperID);
                helperMessage.DispatherID = _dispatcherID;
                message.DispatherID       = _dispatcherID;
                receaverQueue.EnqueueMessage(helperMessage);
                _receaverWaitHandle.Set();
                if (!_dispatcherWaitHandle.WaitOne(message.TimeOut))
                {
                    return(IPCDispatchResult.Timeout);
                }
            } finally {
                RemotingServices.Disconnect(message);
            }
            return(IPCDispatchResult.Success);
        }
        public IIPCMessage DequeueMessage()
        {
            IIPCMessage tmpResult = tasks.Dequeue();

            if (tmpResult is IPCSyncHelperMessage)
            {
                IPCSyncHelperMessage messageHelper = tmpResult as IPCSyncHelperMessage;
                IIPCMessage          realMessage   = (IIPCMessage)Activator.GetObject(messageHelper.OwnerType,
                                                                                      messageHelper.OwnerFullUri);
                return(realMessage);
            }
            else
            {
                return(tmpResult);
            }
        }