protected void InitItems(int initialInstances)
 {
     if (initialInstances <= 0)
     {
         if (null != _logger)
         {
             _logger.Error("实例化对象池项时发生异常:对象池长度不能为空");
         }
         throw new ArgumentException("对象池长度不能为空!", "initialInstances");
     }
     for (int i = 0; i < initialInstances; ++i)
     {
         _free.Add(_factory.CreateObject());
     }
 }
Example #2
0
        public Object BorrowObject()
        {
            Object currObj = null;

            if (0 != m_pool.Count)
            {
                currObj = m_pool.Pop();
            }
            else
            {
                if (m_activeNum < m_maxNum)
                {
                    if (null == factory)
                    {
                        throw new System.Exception();
                    }

                    currObj = factory.CreateObject() as GameObject;
                    if (null == currObj)
                    {
                        throw new System.Exception("obj is null");
                    }
                }
                else
                {
                    //这里标记为空
                    return(null);
                }
            }

            ++m_activeNum;

            return(currObj);
        }
Example #3
0
 /// <summary>
 /// 初始化池
 /// </summary>
 protected virtual void Init(int size)
 {
     for (int i = 0; i < size; i++)
     {
         free.Add(factory.CreateObject());
     }
 }
Example #4
0
        internal ObjectPoolItem <T> CreateObject(CancellationToken cancellationToken)
        {
            ObjectPoolItem <T> item = null;

            while (true)
            {
                if (_idleItems.Count > 0)
                {
                    lock (_idleItems)
                    {
                        if (_idleItems.Count > 0)
                        {
                            var last = _idleItems.Last;
                            _idleItems.RemoveLast();
                            item = last.Value;
                            Log.Trace("Item(key:{0}) reused from object pool. idle: {1}, active: {2}.", item.Key, _idleItems.Count, _activeItems.Count);
                        }
                    }

                    lock (_activeItems)
                    {
                        _activeItems.Add(item.Key, item);
                    }

                    _factory.InitializeObject(item.Value);
                    break;
                }
                else
                {
                    var count = _idleItems.Count + _activeItems.Count;

                    if (count < MaxSize)
                    {
                        var creationDate = LocalTime.Default.Now;
                        var value        = _factory.CreateObject();
                        var key          = Interlocked.Increment(ref _key);
                        item = new ObjectPoolItem <T>(key, value, creationDate);

                        lock (_activeItems)
                        {
                            _activeItems.Add(item.Key, item);
                        }

                        Log.Trace("New item(key:{0}) created in object pool. idle: {1}, active: {2}.", key, _idleItems.Count, _activeItems.Count);
                        break;
                    }
                    else
                    {
                        Log.Trace("object pool is active. Waiting for idle item...");
                        _idleEvent.Reset();

                        WaitHandle[] waitHandles =
                        {
                            cancellationToken.WaitHandle,
                            _idleEvent
                        };

                        var i = WaitHandle.WaitAny(waitHandles, 30000, false);

                        if (i == 0)
                        {
                            break;
                        }
                        else if (i == 1)
                        {
                        }
                        else if (i == WaitHandle.WaitTimeout)
                        {
                            throw new ApplicationException("ObjectPool.CreateObject timeout.");
                        }
                    }
                }
            }

            return(item);
        }