private bool _AttachListenerAsync(int inEventKey, IGEventListener inListener)
        {
            bool ret = false;

            if (inListener == null)
            {
                Log.LMN.LogUtil.Error("MBLogicNode._AttachListenerAsync: inLogicNode is null");
                return(ret);
            }

            //置脏,导致这棵子树需要进入更新流程//
            IsListenerTreeNeedsUpdate = true;
            IGLogicNode parent = ParentNode;

            while (parent != null && !parent.IsListenerTreeNeedsUpdate)
            {
                parent.IsListenerTreeNeedsUpdate = true;
                parent = parent.ParentNode;
            }

            EventListenerUpdateOperation updateOp = new EventListenerUpdateOperation();

            updateOp.mListener      = inListener;
            updateOp.mIsAddOrRemove = true;
            updateOp.mEventKey      = inEventKey;
            mAsyncListenerOps.Add(updateOp);

            inListener.ListenerStatus = AttachableStatus.Attaching;

            ret = true;
            return(ret);
        }
        /// <summary>
        /// 更新Listener节点树
        /// </summary>
        public void UpdateListenerTree()
        {
            if (!IsNodeActive)
            {
                return;
            }

            if (IsListenerTreeNeedsUpdate)
            {
                IsListenerTreeNeedsUpdate = false;

                //注意,这个Update是深度优先的,防止子节点的异步操作被跳过//
                for (int i = 0; i < mSubNodes.Count; i++)
                {
                    mSubNodes[i].mLogicNode.UpdateListenerTree();
                }

                for (int i = 0; i < mAsyncListenerOps.Count; i++)
                {
                    EventListenerUpdateOperation op = mAsyncListenerOps[i];
                    if (op.mIsAddOrRemove)
                    {
                        _AttachListenerSync(op.mEventKey, op.mListener);
                    }
                    else
                    {
                        _DetachListenerSync(op.mEventKey, op.mListener);
                    }
                }
                mAsyncListenerOps.Clear();
            }
        }
        private bool _DetachListenerAsync(int inEventKey, IGEventListener inListener)
        {
            bool ret = false;

            if (inListener == null)
            {
                Log.LMN.LogUtil.Error("MBLogicNode._DetachListenerAsync: inLogicNode is null");
                return(ret);
            }

            //置脏,导致这棵子树需要进入更新流程//
            IsListenerTreeNeedsUpdate = true;
            IGLogicNode parent = ParentNode;

            while (parent != null && !parent.IsListenerTreeNeedsUpdate)
            {
                parent.IsListenerTreeNeedsUpdate = true;
                parent = parent.ParentNode;
            }

            List <GEventListenerWrapper> listenerWrappers = null;

            if (!mEventListenerMap.TryGetValue(inEventKey, out listenerWrappers))
            {
                Log.LMN.LogUtil.Error("MBLogicNode._DetachListenerAsync: no event listener for -> {0} on {1}", inEventKey, inListener);
                return(ret);
            }

            //快速找出需要移除的节点位置//
            int priority = inListener.GetPriority(inEventKey);
            int index    = PrioritySortUtil.GetDecSeqRefArrayFirstIndex <GEventListenerWrapper>(priority, listenerWrappers);

            for (int i = index; i < listenerWrappers.Count && listenerWrappers[i].PriorityVal == priority; i++)
            {
                GEventListenerWrapper wrapper = listenerWrappers[i];
                object listenerObj            = wrapper.mEventListenerWeakRef.Target;
                if (listenerObj == inListener)
                {
                    inListener.ListenerStatus = AttachableStatus.Detaching;
                    ret = true;
                    break;
                }
            }

            if (ret)
            {
                EventListenerUpdateOperation updateOp = new EventListenerUpdateOperation();
                updateOp.mListener      = inListener;
                updateOp.mIsAddOrRemove = false;
                updateOp.mEventKey      = inEventKey;
                mAsyncListenerOps.Add(updateOp);
            }

            return(ret);
        }