private void ReapSockets(object state) {
lock(_syncroot) {
var disposed = (from busy in _busySockets where busy.Key.IsDisposed select busy.Key).ToArray();
foreach(var socket in disposed) {
_busySockets.Remove(socket);
}
var staleTime = DateTime.UtcNow.Subtract(IdleTimeout);
var dead = 0;
while(true) {
// check oldest (first in available list) for staleness
if(!_availableSockets.Any() || _availableSockets[0].Queued > staleTime) {
break;
}
var idle = _availableSockets[0];
_availableSockets.RemoveAt(0);
idle.Socket.Dispose();
dead++;
}
_log.DebugFormat("reaped {4} disposed and & {5} dead sockets (max: {0}, available: {1}, busy: {2}, queued: {3})",
MaxConnections,
_availableSockets.Count,
_busySockets.Count,
_waitingQueue.Count,
disposed.Length,
dead
);
}
}