示例#1
0
        public void Run()
        {
            async Task wrappedGhostThreadFunction()
            {
                try
                {
                    if (IsHaveReturn)
                    {
                        var res = await(dynamic) Method.Invoke(Obj, Args);
                        if (res is Result xres)
                        {
                            Result = xres;
                        }
                        else
                        {
                            Result = new Result(res);
                        }

                        Result.Id = this.Id;
                        Complete?.Invoke(Result);
                    }
                    else
                    {
                        await(Task) Method.Invoke(Obj, Args);
                    }
                }
                catch (Exception er)
                {
                    IsError = true;
                    Error   = er;

                    if (IsHaveReturn)
                    {
                        Complete?.Invoke(GetExceptionResult(er, Id));
                    }

                    if (PushException(er))
                    {
                        Log.Error($"Cmd:{Cmd} Error:\r\n {Error}");
                    }
                }
                finally
                {
                    IsOver = true;
                    CCloudClient.RemoveAsyncCall(Id);
                }
            }

            _fiber = new Fiber();
            _fiber.SetAction(wrappedGhostThreadFunction);
            _fiber.Start();
        }
示例#2
0
        public void Run()
        {
            Func <Task> wrappedGhostThreadFunction = async() =>
            {
                try
                {
                    if (IsHaveReturn)
                    {
                        Result = await(Task <ReturnResult>) Method.Invoke(Obj, Args);

                        if (Complete != null)
                        {
                            Complete(Result);
                        }
                    }
                    else
                    {
                        await(Task) Method.Invoke(Obj, Args);
                    }
                }
                catch (Exception er)
                {
                    IsError = true;
                    Error   = er;

                    if (IsHaveReturn)
                    {
                        var nullx = new ReturnResult();
                        nullx.Id = this.Id;

                        if (Complete != null)
                        {
                            Complete(nullx);
                        }
                    }

                    LogAction.Log(LogType.Err, "Cmd:" + Cmd + " Error:\r\n" + Error.ToString());
                }
                finally
                {
                    IsOver = true;
                    CCloudClient.RemoveAsyncCall(Id);
                }
            };


            fiber = new Fiber();
            fiber.SetAction(wrappedGhostThreadFunction);
            fiber.Start();
        }
示例#3
0
        /// <summary>
        /// CALL RETURN
        /// </summary>
        /// <param name="cmdTag"></param>
        /// <param name="args"></param>
        /// <returns></returns>
        public ResultAwatier Func(int cmdTag, params object[] args)
        {
            CallPack buffer = new CallPack()
            {
                Id        = Common.MakeID,
                CmdTag    = cmdTag,
                Arguments = new List <byte[]>(args.Length)
            };

            foreach (var item in args)
            {
                Type type = item.GetType();

                buffer.Arguments.Add(Serialization.PackSingleObject(type, item));
            }


            using (MemoryStream stream = new MemoryStream())
            {
                BinaryWriter bufflist = new BinaryWriter(stream);

                if (CCloudClient.EncodingHandler != null)
                {
                    bufflist.Write(CmdDef.CallCmd);

                    bufflist.Write(buffer.Id);
                    bufflist.Write(buffer.CmdTag);
                    bufflist.Write(buffer.Arguments.Count);
                    foreach (var arg in buffer.Arguments)
                    {
                        bufflist.Write(arg.Length);
                        bufflist.Write(arg);
                    }

                    byte[] fdata = CCloudClient.EncodingHandler(stream.ToArray());

                    stream.Position = 0;
                    stream.SetLength(0);
                    bufflist.Write(0);
                    bufflist.Write(fdata);
                }
                else
                {
                    bufflist.Write(0);
                    bufflist.Write(CmdDef.CallCmd);

                    bufflist.Write(buffer.Id);
                    bufflist.Write(buffer.CmdTag);
                    bufflist.Write(buffer.Arguments.Count);
                    foreach (var arg in buffer.Arguments)
                    {
                        bufflist.Write(arg.Length);
                        bufflist.Write(arg);
                    }
                }

                int l = (int)(stream.Length);

                byte[] data = BufferFormat.GetSocketBytes(l);

                stream.Position = 0;

                bufflist.Write(data);


                byte[] pdata = stream.ToArray();


                CCloudClient.AddAsyncCallBack(this, buffer.Id);

                CallSend?.Invoke(pdata);
            }

            return(_fiber.Read());
        }