private void OnInvokeOperationReturn(RpcReturn Return) { var invokectx = InvokeWaitTable[Return.CallID]; invokectx.Return = Return; InvokeWaitTable.Remove(Return.CallID); invokectx.EventReturn.Set(); }
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; })); }