private Task <object> Callback(RpcMethodMetadata methodMetadata, int requestId, int timeout, object[] parameters, CodecAttribute codec) { return(callBackHandler.AddCallBack(requestId, timeout) .ContinueWith(t => { if (t.Result.Ret != Const.ServerSuccess) { throw new TarsException(t.Result.Ret, t.Result.ResultDesc); } var info = codec.DecodeReturnValue(t.Result, methodMetadata); if (info.Item2 == null) { return info.Item1; } var index = 0; foreach (var item in methodMetadata.Parameters.Where(i => i.ParameterType.IsByRef)) { if (index >= info.Item2.Length) { break; } parameters[item.Position] = info.Item2[index++]; } return info.Item1; })); }
private object HandleResult(Task task, RpcMethodMetadata methodMetadata, int requestId, int timeout, object[] parameters, CodecAttribute codec) { switch (methodMetadata.InvokeStatus) { case InvokeStatus.SyncCall: return(Callback(methodMetadata, requestId, timeout, parameters, codec).Result); case InvokeStatus.AsyncCall: return(Callback(methodMetadata, requestId, timeout, parameters, codec)); case InvokeStatus.Oneway: default: return(null); } }