public static void Invoke(string methodId, IPeer peer, ResponseCallback responseCallback, Action<ISerializable> action) { using (var serializable = new Serializable(null)) { action?.Invoke(serializable); var rpcInvoke = new RpcInvoke("", methodId); RpcProxy.Invoke(MessageType.RpcInvoke, rpcInvoke, serializable.WriteStream, peer, responseCallback); } }
public Task <RpcReturn> Invoke(RpcInvoke ri) { var invokectx = new InvokeContext(GlobalObjectPool.ManualResetEventPool.Pop()); InvokeWaitTable.Add(ri.CallID, invokectx); return(Task <RpcReturn> .Factory.StartNew(() => { ri.WriteDelimitedTo(m_NetworkStream); m_NetworkStream.FlushAsync().Wait(); // 调用返回时会先从InvokeWaitTable当中移除对应的InvokeContext, // 然后再触发InvokeContext.EventReturn,所以要使用预先保存的invokectx而不从InvokeWaitTable当中取值 invokectx.EventReturn.WaitOne(); GlobalObjectPool.ManualResetEventPool.Push(invokectx.EventReturn); return invokectx.Return; })); }
public override void OnConnected(ITcpSession session) { if (!RpcFactory.invokeDict.ContainsKey(session.SessionId)) { var invoke = new RpcInvoke(session, rpcConfig.RemoteInvokeTimeout); RpcFactory.invokeDict.TryAdd(session.SessionId, invoke); } session.SessionData.Set("proxyfactory",RpcFactory); rpcContainer.CreateScope(session.SessionId); }