public RPCExecManager.RPCWait AddCalBack(RPCExecManager.FRPCReturnCallBack cb) { lock (WaitCallBacks) { var serialId = CurSerialId++; RPCExecManager.RPCWait wait; if (WaitCallBacks.TryGetValue(serialId, out wait)) { if (wait.RetCallBack != null && wait.RetCallBack.Method != null) { System.Diagnostics.Debug.WriteLine($"RPCExecManager A CallBack has Timeout:{wait.RetCallBack.Method.DeclaringType.FullName}.{wait.RetCallBack.Method.Name}"); } wait.RetCallBack(PkgReader.NullReader, true); wait.RetCallBack = cb; } else { var tempTask = RPCWaitAllocator.QueryObject(); tempTask.Wait(); wait = tempTask.Result; wait.SerialId = serialId; wait.RetCallBack = cb; wait.CallTime = Support.Time.GetTickCount(); WaitCallBacks.Add(wait.SerialId, wait); } return(wait); } }
private RPCExecManager.RPCWait WaitDoCallImpl(long timeOut, RPCExecManager.FRPCReturnCallBack cb, ERouteTarget route = ERouteTarget.Self, Net.NetConnection conn = null, RPCRouter router = null) { var Index = this.GetMethodBinder().Index; var pkg = new PkgWriter(this.GetPkgSize()); if (Index >= RPCExecManager.MaxRPC) { System.Diagnostics.Debug.WriteLine($"RPC Index is invalid:{this.GetType().FullName}"); return(null); } pkg.Write((byte)route); if (router != null) { router.RouteInfo.Save(pkg, route); } RPCExecManager.RPCWait waiter = null; if (cb != null) { waiter = RPCExecManager.Insance.AddCalBack(cb); this.SerialId = waiter.SerialId; pkg.Waiter = waiter; if (timeOut < 0) { timeOut = long.MaxValue; } waiter.Timout = timeOut; Index |= RPCExecManager.WaitFlag; pkg.SetHasReturn(true); pkg.Write(Index); pkg.Write(this.SerialId); } else { pkg.SetHasReturn(false); pkg.Write(Index); } WriteObject(pkg); if (conn != null) { pkg.SendBuffer(conn); } return(waiter); }
private RPCExecManager.RPCWait WaitDoCallImpl_Hash(long timeOut, RPCExecManager.FRPCReturnCallBack cb, ERouteTarget route = ERouteTarget.Self, Net.NetConnection conn = null, RPCRouter router = null) { var hash = this.GetMethodBinder().MethordHash; var pkg = new PkgWriter(this.GetPkgSize()); pkg.SetHashIndex(true); pkg.Write((byte)route); if (router != null) { router.RouteInfo.Save(pkg, route); } RPCExecManager.RPCWait waiter = null; if (cb != null) { pkg.SetHasReturn(true); waiter = RPCExecManager.Insance.AddCalBack(cb); this.SerialId = waiter.SerialId; pkg.Waiter = waiter; if (timeOut < 0) { timeOut = long.MaxValue; } waiter.Timout = timeOut; pkg.Write(hash); pkg.Write(this.SerialId); } else { pkg.SetHasReturn(false); pkg.Write(hash); } WriteObject(pkg); if (conn != null) { pkg.SendBuffer(conn); } pkg.Dispose(); return(waiter); }
public RPCExecManager.RPCWait S2S_Call <T>(long timeOut, ERouteTarget target = ERouteTarget.Data, FRPCTypeReturnCallBack <T> cb = null) where T : RPCReturnValue, new() { AssertReturnType(this.GetType(), typeof(T)); if (cb == null) { return(WaitDoCallImpl(timeOut, null, ERouteTarget.Self, RPCExecManager.Insance.GetServerConnect(target))); } RPCExecManager.FRPCReturnCallBack fn = (PkgReader data, bool isTimeOut) => { if (isTimeOut) { cb(null, true); return; } T retValue = new T(); retValue.ReadObject(data); cb(retValue, false); }; return(WaitDoCallImpl(timeOut, fn, ERouteTarget.Self, RPCExecManager.Insance.GetServerConnect(target))); }
public RPCExecManager.RPCWait WaitHashCall <T>(long timeOut, FRPCTypeReturnCallBack <T> cb, ERouteTarget route = ERouteTarget.Self, Net.NetConnection conn = null, RPCRouter router = null) where T : RPCReturnValue, new() { AssertReturnType(this.GetType(), typeof(T)); if (cb == null) { return(WaitDoCallImpl_Hash(timeOut, null, route, conn, router)); } RPCExecManager.FRPCReturnCallBack fn = (PkgReader data, bool isTimeOut) => { if (isTimeOut) { cb(null, true); return; } T retValue = new T(); retValue.ReadObject(data); cb(retValue, false); }; return(WaitDoCallImpl_Hash(timeOut, fn, route, conn, router)); }