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(); }
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(); }
/// <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()); }