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()); } }
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); }
/// <summary> /// 初始化池 /// </summary> protected virtual void Init(int size) { for (int i = 0; i < size; i++) { free.Add(factory.CreateObject()); } }
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); }