public IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink replySink) { #if !DISABLE_REMOTING ServerIdentity identity = (ServerIdentity)RemotingServices.GetMessageTargetIdentity(msg); Context oldContext = null; if (Threading.Thread.CurrentContext != identity.Context) { oldContext = Context.SwitchToContext(identity.Context); } try { Context.NotifyGlobalDynamicSinks(true, msg, false, true); Thread.CurrentContext.NotifyDynamicSinks(true, msg, false, false); if (replySink != null) { replySink = new ContextRestoreSink(replySink, oldContext, msg); } IMessageCtrl res = identity.AsyncObjectProcessMessage(msg, replySink); if (replySink == null) { Context.NotifyGlobalDynamicSinks(false, msg, false, false); Thread.CurrentContext.NotifyDynamicSinks(false, msg, false, false); } return(res); } catch (Exception ex) { if (replySink != null) { replySink.SyncProcessMessage(new ReturnMessage(ex, (IMethodCallMessage)msg)); } return(null); } finally { if (oldContext != null) { Context.SwitchToContext(oldContext); } } #else return(null); #endif }
public IMessageCtrl AsyncProcessMessage (IMessage msg, IMessageSink replySink) { ServerIdentity identity = (ServerIdentity) RemotingServices.GetMessageTargetIdentity (msg); Context oldContext = null; if (Threading.Thread.CurrentContext != identity.Context) oldContext = Context.SwitchToContext (identity.Context); try { Context.NotifyGlobalDynamicSinks (true, msg, false, true); Thread.CurrentContext.NotifyDynamicSinks (true, msg, false, false); if (replySink != null) replySink = new ContextRestoreSink (replySink, oldContext, msg); IMessageCtrl res = identity.AsyncObjectProcessMessage (msg, replySink); if (replySink == null) { Context.NotifyGlobalDynamicSinks (false, msg, false, false); Thread.CurrentContext.NotifyDynamicSinks (false, msg, false, false); } return res; } catch (Exception ex) { if (replySink != null) replySink.SyncProcessMessage (new ReturnMessage (ex, (IMethodCallMessage)msg)); return null; } finally { if (oldContext != null) Context.SwitchToContext (oldContext); } }