private void RebuildIndexes() { _serverAccessLock.UpgradeToWriterLock(Timeout.Infinite); try { Type ltype = _configuration.NodeLocator; IRedisNodeLocator l = ltype == null ? new DefaultNodeLocator() : (IRedisNodeLocator)FastActivator.CreateInstance(ltype); l.Initialize(_workingServers); _nodeLocator = l; _publicWorkingServers = null; } finally { _serverAccessLock.ReleaseLock(); } }
void IDisposable.Dispose() { var rwl = _serverAccessLock; if (Interlocked.CompareExchange(ref _serverAccessLock, null, rwl) == null) return; GC.SuppressFinalize(this); try { rwl.UpgradeToWriterLock(Timeout.Infinite); Action<IRedisNode> cleanupNode = node => { //node.SocketConnected -= OnSocketConnected; node.Dispose(); }; // dispose the nodes (they'll kill connections, etc.) _deadServers.ForEach(cleanupNode); _workingServers.ForEach(cleanupNode); _deadServers.Clear(); _workingServers.Clear(); _nodeLocator = null; _isAliveTimer.Dispose(); _isAliveTimer = null; } finally { rwl.ReleaseLock(); } }