void Shrink(Delegate_deleteFile procDeleteFile) { List <string> keys = new List <string>(); List <PageItem> items = new List <PageItem>(); foreach (string key in _pageTable.Keys) { PageItem item = _pageTable[key]; if (item.State == "OK") { keys.Add(key); } } if (keys.Count > 0) { foreach (string key in keys) { _pageTable.Remove(key); } foreach (PageItem item in items) { if (procDeleteFile != null) { procDeleteFile(item.FilePath); } else { item.Delete(); } } } }
// 清除已经失效的 PageItem // parameters: // delta 闲置多少时间以上才清理 public void Clean(bool bLock, TimeSpan delta, Delegate_deleteFile procDeleteFile, CancellationToken token) { List <string> keys = new List <string>(); List <PageItem> items = new List <PageItem>(); if (bLock) { _lock.EnterReadLock(); } try { DateTime now = DateTime.Now; foreach (string key in _pageTable.Keys) { token.ThrowIfCancellationRequested(); PageItem item = _pageTable[key]; if (item.State == "OK" && now - item.LastUse > delta) { keys.Add(key); items.Add(item); } } } finally { if (bLock) { _lock.ExitReadLock(); } } if (keys.Count > 0) { if (bLock) { _lock.EnterWriteLock(); } try { foreach (string key in keys) { token.ThrowIfCancellationRequested(); _pageTable.Remove(key); } } finally { if (bLock) { _lock.ExitWriteLock(); } } foreach (PageItem item in items) { token.ThrowIfCancellationRequested(); if (procDeleteFile != null) { procDeleteFile(item.FilePath); } else { item.Delete(); } } } }