예제 #1
0
        /// <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);
        }
예제 #3
0
        /// <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);
        }