예제 #1
0
        public void OnFarCallFinished(System.UInt16 id, PackageProxy ret, bool bTimeOut)
        {
            RPCWaitHandle result = null;

            lock (this)
            {
                if (mWaitHandles.TryGetValue(id, out result))
                {
                    mWaitHandles.Remove(id);
                }
            }

            if (result != null)
            {
                try
                {
                    result.Raise_OnFarCallFinished(ret, bTimeOut);
                }
                catch (System.Exception ex)
                {
                    Log.Log.Common.Print(ex.ToString());
                    Log.Log.Common.Print(ex.StackTrace.ToString());
                }
            }
        }
예제 #2
0
        public RPCWaitHandle NewWaitHandleTimeOut(System.Diagnostics.StackTrace st, float timeOut)
        {
            lock (this)
            {
                RPCWaitHandle result = new RPCWaitHandle();
                result.CallID   = ++CurrentId;
                result.mTimeOut = timeOut;
                try
                {
                    mWaitHandles.Add(result.CallID, result);
                }
                catch (System.Exception)
                {
                    ClearTimeoutHandles();
                    mWaitHandles.Add(result.CallID, result);
                    Log.Log.Common.Print("NewWaitHandle Add Failed,ClearTimeoutHandles");
                }
                if (st != null)
                {
                    result.SrcFile = st.GetFrame(0).GetMethod().Name;
                }

                return(result);
            }
        }
예제 #3
0
        public RPCWaitHandle WaitDoClient2PlanesPlayer(Iocp.NetConnection conn, float timeOut)
        {
            PkgType = PackageType.PKGT_C2P_Player_SendAndWait;
            if (RPCManager == null)
            {
                RPCManager = RPCNetworkMgr.Instance;
            }
            RPCWaitHandle handle = RPCManager.NewWaitHandleTimeOut(null, timeOut);

            SerialId = handle.CallID;
            SendBuffer(conn);
            return(handle);
        }
예제 #4
0
        public void _SyncDoCommand(Iocp.TcpClient cltConn, int timeout)
        {
            if (RPCManager == null)
            {
                RPCManager = RPCNetworkMgr.Instance;
            }
            PkgType = PackageType.PKGT_SendAndWait;
            RPCWaitHandle handle = RPCManager.NewWaitHandle(null);

            SendBuffer(cltConn);
            while (true)
            {
                cltConn.Update();
                if (null == RPCManager.GetWaitHandle(handle.CallID))
                {
                    break;
                }

                System.Threading.Thread.Sleep(1);
            }
        }
예제 #5
0
        public RPCWaitHandle WaitDoCommandWithTimeOut(float timeOut, Iocp.NetConnection conn, CommandTargetType target, System.Diagnostics.StackTrace st)
        {//其实这里有很微弱的多线程问题,后面如果设置delegate的时候,网络已经返回的话,不过这个情况应该基本不可能发生
            switch (target)
            {
            case CommandTargetType.DefaultType:
                PkgType = PackageType.PKGT_SendAndWait;
                break;

            case CommandTargetType.Planes:
                PkgType = PackageType.PKGT_C2P_SendAndWait;
                break;
            }
            if (RPCManager == null)
            {
                RPCManager = RPCNetworkMgr.Instance;
            }
            RPCWaitHandle handle = RPCManager.NewWaitHandleTimeOut(st, timeOut);

            SerialId = handle.CallID;
            SendBuffer(conn);
            return(handle);
        }