Exemple #1
0
        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();
                    }
                }
            }
        }
Exemple #2
0
        // 清除已经失效的 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();
                    }
                }
            }
        }