// 按需清理通道 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); }
// 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); }
public int CleanChannel(Delegate_needClean func_needClean) { return(_cleanChannel(true, func_needClean)); }