Beispiel #1
0
 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);
     }
 }
Beispiel #2
0
        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;
            }));
        }
Beispiel #3
0
 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);
 }