public void CallMethod(string module, string MethodName, List <Type> argTypeList, List <byte[]> arglist, out object[] args) { args = null; RPCCallPack call = new RPCCallPack() { Id = MakeID.GetID(), CallTime = MakeID.GetTick(), CallModule = module, Method = MethodName, Arguments = arglist }; TaskCompletionSource <ZYClient_Result_Return> var = new TaskCompletionSource <ZYClient_Result_Return>(TaskCreationOptions.AttachedToParent); if (!ReturnValueDiy.TryAdd(call.Id, var)) { SpinWait.SpinUntil(() => ReturnValueDiy.TryAdd(call.Id, var)); } byte[] data = BufferFormat.FormatFCA(call); if (CallBufferOutSend != null) { CallBufferOutSend(data); } if (var.Task.Wait(OutTime)) { ZYClient_Result_Return returnx = var.Task.Result; if (returnx.Arguments != null && returnx.Arguments.Count > 0 && arglist.Count == returnx.Arguments.Count) { args = new object[returnx.Arguments.Count]; for (int i = 0; i < argTypeList.Count; i++) { args[i] = Serialization.UnpackSingleObject(argTypeList[i], returnx.Arguments[i]); } } } else { ReturnValueDiy.TryRemove(call.Id, out var); if (ErrMsgOut != null) { ErrMsgOut(module + "->" + MethodName + " out time,Please set the timeout time."); } } }
public Result CallMethod <Result>(string module, string MethodName, List <RPCArgument> arglist, out object[] args) { args = null; RPCCallPack call = new RPCCallPack() { Id = MakeID.GetID(), CallTime = DateTime.Now, CallModule = module, Method = MethodName, Arguments = arglist, IsNeedReturn = true, }; WaitReturnValue var = new WaitReturnValue(); using (var.waitHandle = new EventWaitHandle(false, EventResetMode.AutoReset)) { ReturnValueDiy.TryAdd(call.Id, var); byte[] data = BufferFormat.FormatFCA(call); if (CallBufferOutSend != null) { CallBufferOutSend(data); } if (var.waitHandle.WaitOne(OutTime)) { ZYClient_Result_Return returnx = var.returnvalue; Type type = returnx.ReturnType; if (returnx.Arguments != null && returnx.Arguments.Count > 0 && arglist.Count == returnx.Arguments.Count) { args = new object[returnx.Arguments.Count]; for (int i = 0; i < returnx.Arguments.Count; i++) { args[i] = Serialization.UnpackSingleObject(returnx.Arguments[i].type, returnx.Arguments[i].Value); } } if (type != null) { object returnobj = Serialization.UnpackSingleObject(type, returnx.Return); return((Result)returnobj); } else { return(default(Result)); } } else { ReturnValueDiy.TryRemove(call.Id, out var); throw new TimeoutException("out time,Please set the timeout time."); } } }