コード例 #1
0
ファイル: TcpChannel.cs プロジェクト: keji56/chord
        // 按需清理通道
        public int Clean(Delegate_needClean procNeedClear)
        {
            List <TcpChannel> delete_channels = new List <TcpChannel>();

            _lock.EnterReadLock();
            try
            {
                DateTime now = DateTime.Now;
                foreach (TcpChannel channel in _channels)
                {
                    if (procNeedClear(channel) == true)
                    {
                        delete_channels.Add(channel);
                    }
                }
            }
            finally
            {
                _lock.ExitReadLock();
            }

            if (delete_channels.Count > 0)
            {
                _lock.EnterWriteLock();
                try
                {
                    foreach (TcpChannel channel in delete_channels)
                    {
                        _channels.Remove(channel);
                    }
                }
                finally
                {
                    _lock.ExitWriteLock();
                }

                foreach (TcpChannel channel in delete_channels)
                {
                    channel.Close();
                }
            }

            return(delete_channels.Count);
        }
コード例 #2
0
ファイル: LibraryChannelPool.cs プロジェクト: zgren/dp2
        // return:
        //      清理掉的通道数目
        int _cleanChannel(bool bLock, Delegate_needClean func_needClean)
        {
            List <LibraryChannelWrapper> deletes = new List <LibraryChannelWrapper>();

            if (bLock == true)
            {
                if (this.m_lock.TryEnterWriteLock(m_nLockTimeout) == false)
                {
                    throw new LockException("锁定尝试中超时");
                }
            }
            try
            {
                for (int i = 0; i < this.Count; i++)
                {
                    LibraryChannelWrapper wrapper = this[i];
                    if (wrapper.InUsing == false &&
                        (func_needClean == null || func_needClean(wrapper.Channel) == true))
                    {
                        this.RemoveAt(i);
                        i--;
                        deletes.Add(wrapper);
                    }
                }
            }
            finally
            {
                if (bLock == true)
                {
                    this.m_lock.ExitWriteLock();
                }
            }

            foreach (LibraryChannelWrapper wrapper in deletes)
            {
                wrapper.Channel.BeforeLogin -= new BeforeLoginEventHandle(channel_BeforeLogin);
                wrapper.Channel.AfterLogin  -= inner_channel_AfterLogin;
                wrapper.Channel.Close();
            }

            return(deletes.Count);
        }
コード例 #3
0
ファイル: LibraryChannelPool.cs プロジェクト: zgren/dp2
 public int CleanChannel(Delegate_needClean func_needClean)
 {
     return(_cleanChannel(true, func_needClean));
 }