/// <summary> /// 将使用完成的<see cref="SocketAsyncEventArgs"/>对象回收到缓存池。 /// </summary> /// <param name="args">需要缓存的<see cref="SocketAsyncEventArgs"/>对象。</param> public void Return(SocketAsyncEventArgs args) { if (args == null) { throw new ArgumentNullException("args"); } WeakSocketAsyncEventArgs weakArgs = args as WeakSocketAsyncEventArgs; //如果是临时创建的弱引用对象,回收到弱引用对象缓存池。否则,回收到固定的缓存池。 if (weakArgs != null) { lock (_weakSaeaQueue) { #if NET45 _weakSaeaQueue.Enqueue( new WeakReference <WeakSocketAsyncEventArgs>(weakArgs)); #else _weakSaeaQueue.Enqueue(new WeakReference(weakArgs)); #endif } } else { _saeaQueue.Enqueue(args); } _log.Info("Return: " + ToString()); }
public SocketAsyncEventArgs Take() { _log.Info("Take: " + ToString()); SocketAsyncEventArgs args = null; //优先使用固定缓存池 if (_saeaQueue.TryDequeue(out args)) { return(args); } //如果固定缓存池没有了,而且分配的数量还没达到最大缓存数量, //则创建一个新的 SocketAsyncEventArgs。 lock (_syncRoot) { if (_allocatedCount < _poolSize) { args = Allocate(false); _allocatedCount++; return(args); } } //如果固定缓存池已经使用完,且分配的数量已达到最大缓存数量,则查找弱引用缓存池。 WeakSocketAsyncEventArgs weakArgs = null; lock (_weakSaeaQueue) { while (_weakSaeaQueue.Count > 0) { #if NET45 if (_weakSaeaQueue.Dequeue().TryGetTarget(out weakArgs)) { return(weakArgs); } #else WeakReference weakArgsRef = _weakSaeaQueue.Dequeue(); if (weakArgsRef.IsAlive) { weakArgs = weakArgsRef.Target as WeakSocketAsyncEventArgs; return(weakArgs); } #endif } } //如果前面的都没有了,则创建一个新的弱引用的 WeakSocketAsyncEventArgs。 args = Allocate(true); return(args); }
/// <summary> /// 从缓存池中获取一个<see cref="SocketAsyncEventArgs"/>, /// 如果缓存池中的对象已经用完,则创建一个新的<see cref="SocketAsyncEventArgs"/>。 /// </summary> /// <returns>一个<see cref="SocketAsyncEventArgs"/>对象。</returns> public SocketAsyncEventArgs Take() { _log.Info("Take: " + ToString()); SocketAsyncEventArgs args; //优先使用固定缓存池。 if (_saeaQueue.TryDequeue(out args)) { return(args); } lock (_syncRoot) { if (_allocatedCount < _poolSize) { args = Allocate(false); _allocatedCount++; return(args); } } //如果固定缓存池已经使用完,则查找弱引用缓存池,如果缓存池的没有,则创建一个新的。 lock (_weakSaeaQueue) { WeakSocketAsyncEventArgs weakArgs = null; while (_weakSaeaQueue.Count > 0) { #if NET45 if (_weakSaeaQueue.Dequeue().TryGetTarget(out weakArgs)) { return(weakArgs); } #else WeakReference weakArgsRef = _weakSaeaQueue.Dequeue(); if (weakArgsRef.IsAlive) { weakArgs = weakArgsRef.Target as WeakSocketAsyncEventArgs; return(weakArgs); } #endif } } return(Allocate(true)); }
SocketAsyncEventArgs Allocate(bool weak) { SocketAsyncEventArgs args; if (weak) { args = new WeakSocketAsyncEventArgs(); args.SetBuffer(new byte[_bufferSize], 0, _bufferSize); } else { args = new SocketAsyncEventArgs(); _fixedBufferManager.SetBuffer(args); } args.UserToken = new AsyncSocketSessionToken(); args.Completed += _completedHandler; return(args); }