public IMessage SyncProcessMessage(IMessage msg) { IMethodCallMessage mcm = (IMethodCallMessage)msg; int timeout = -1; bool timedOut = false; RemotingService.CallbackData data = RemotingService.GetCallbackData(mcm.Uri, mcm.MethodName); if (data != null) { timeout = data.Timeout; if (data.Calling != null) { IMessage r = data.Calling(data.Target, mcm); if (r != null) { return(r); } } } IMessage res = null; if (timeout != -1) { ManualResetEvent ev = new ManualResetEvent(false); ThreadPool.QueueUserWorkItem(delegate { res = ((IMessageSink)nextSink).SyncProcessMessage(msg); ev.Set(); }); if (!ev.WaitOne(timeout, false)) { timedOut = true; res = new ReturnMessage(null, null, 0, mcm.LogicalCallContext, mcm); } } else { res = ((IMessageSink)nextSink).SyncProcessMessage(msg); } if (data != null && data.Called != null) { IMessage cr = data.Called(data.Target, mcm, res as IMethodReturnMessage, timedOut); if (cr != null) { res = cr; } } return(res); }