/// <summary>
        /// will activate handler in next frame
        /// </summary>
        public void FireEvent(EventID eventID, long senderID, long receiverID, object data)
        {
            if (senderID == -1 || receiverID == -1)
            {
                return;
            }
            var eventObj = new CommonEvent(eventID, senderID, receiverID, data);

            _cachedEvents.Add(eventObj);
        }
        private void dispatchCachedEvent()
        {
            //use try-catch-finnaly to ensure cached event can be cleared, regardless of exception and error
            try
            {
                for (int i = 0; i < _cachedEvents.Count; i++)
                {
                    CommonEvent param   = _cachedEvents[i];
                    var         eventID = (EventID)_cachedEvents[i].eventID;

                    if (_allHandlers.ContainsKey(eventID))
                    {
                        for (int j = 0; j < _allHandlers[eventID].Count; j++) //iterate all handler
                        {
                            EventHandlerWithID selectedHandlers = _allHandlers[eventID][j];

                            if (param.receiverID == ReceiverIDAllocator.GLOBALID)//broadcast
                            {
                                if (selectedHandlers.handler(param))
                                {
                                    break;
                                }
                            }
                            else
                            {
                                if (selectedHandlers.handlerID == param.receiverID)
                                {
                                    selectedHandlers.handler(param);
                                    break;//break off
                                }
                            }
                        }
                    }
                }
            }
            catch (System.Exception)
            {
                throw;
            }
            finally
            {
                _cachedEvents.Clear();
            }
        }