Example #1
0
        private void OnInvokeOperationReturn(RpcReturn Return)
        {
            var invokectx = InvokeWaitTable[Return.CallID];

            invokectx.Return = Return;

            InvokeWaitTable.Remove(Return.CallID);

            invokectx.EventReturn.Set();
        }
Example #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;
            }));
        }