public IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink replySink)
        {
            var contextSyncContext  = new ContextSynchronizationContext(SynchronizationContext.Current);
            var syncContextReplacer = new SynchronizationContextReplacer(contextSyncContext);

            DelegateMessageSink.SyncProcessMessageDelegate replySyncDelegate = (n, m) => SyncProcessMessageDelegateForAsyncReply(n, m, syncContextReplacer);
            var newReplySink = new DelegateMessageSink(replySink, replySyncDelegate, null);

            return(m_NextSink.AsyncProcessMessage(msg, newReplySink));
        }
 private IMessage SyncProcessMessageDelegateForAsyncReply(IMessageSink nextSink, IMessage msg, SynchronizationContextReplacer syncContextReplacer)
 {
     syncContextReplacer.Dispose();
     return(nextSink.SyncProcessMessage(msg));
 }