示例#1
0
        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.");
                }
            }
        }
示例#2
0
        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.");
                }
            }
        }