public virtual bool BeforeRemoveFromCache()
        {
            if (EmptyRoomLiveTime <= 0)
            {
                return(true);
            }

            // execute the schedule with the ExecutionFiber so properties
            // are accessed thread safe.
            ExecutionFiber.Enqueue(() => ScheduleRoomRemoval(EmptyRoomLiveTime));
            return(false);
        }
        protected virtual void Dispose(bool dispose)
        {
            IsDisposed = true;

            if (dispose)
            {
                ExecutionFiber.Dispose();
                if (_removeTimer != null)
                {
                    _removeTimer.Dispose();
                    _removeTimer = null;
                }
            }
        }
        protected void ScheduleRoomRemoval(int roomLiveTime)
        {
            if (RemoveTimer != null)
            {
                RemoveTimer.Dispose();
                RemoveTimer = null;
            }

            if (Log.IsDebugEnabled)
            {
                Log.DebugFormat("Scheduling room removal: roomName={0}, liveTime={1:N0}", Name, roomLiveTime);
            }

            RemoveTimer = ExecutionFiber.Schedule(TryRemoveRoomFromCache, roomLiveTime);
        }
 public Room(string name, RoomCacheBase roomCache = null, int emptyRoomLiveTime = 0)
     : this(name, new PoolFiber(), roomCache, emptyRoomLiveTime)
 {
     ExecutionFiber.Start();
 }
 public IDisposable ScheduleMessage(IMessage message, long timeMs)
 {
     return(ExecutionFiber.Schedule(() => ProcessMessage(message), timeMs));
 }
 public void EnqueueOperation(PlayerPeer peer, OperationRequest operationRequest, SendParameters sendParameters)
 {
     ExecutionFiber.Enqueue(() => ExecuteOperation(peer, operationRequest, sendParameters));
 }
 public void EnqueueMessage(IMessage message)
 {
     ExecutionFiber.Enqueue(() => ProcessMessage(message));
 }