public MemoryMappedPage GetPage(int blockId) { if (blockId < 0) { throw new ArgumentOutOfRangeException("blockId"); } int pageIndex = blockId / this.BlocksPerPage; int index = 0; lock (_pages) { //在页面队列中查找指定页面号的页面对象,如果找到则直接返回 for (; index < _pages.Length; index++) { if (_pages[index] == null) { break; } if (pageIndex == _pages[index].PageIndex) { return(_pages[index]); } } //获取即将要彻底销毁的页面对象 var page = _pages[Math.Min(index, _pages.Length - 1)]; //如果即将要销毁的页面对象不为空则彻底销毁它 if (page != null) { page.Kill(); } //以下循环移动待页面队列,以腾出位置给新页面对象 for (int i = Math.Min(index, _pages.Length - 1); i > 0; i--) { _pages[i] = _pages[i - 1]; } return(_pages[0] = new MemoryMappedPage(this, pageIndex, _bufferManager.Storage.CreateViewStream(_storagePosition + (pageIndex * PageSize), PageSize))); } }
public MemoryMappedPage GetPage(int blockId) { if(blockId < 0) throw new ArgumentOutOfRangeException("blockId"); int pageIndex = blockId / this.BlocksPerPage; int index = 0; lock(_pages) { //在页面队列中查找指定页面号的页面对象,如果找到则直接返回 for(; index < _pages.Length; index++) { if(_pages[index] == null) break; if(pageIndex == _pages[index].PageIndex) return _pages[index]; } //获取即将要彻底销毁的页面对象 var page = _pages[Math.Min(index, _pages.Length - 1)]; //如果即将要销毁的页面对象不为空则彻底销毁它 if(page != null) page.Kill(); //以下循环移动待页面队列,以腾出位置给新页面对象 for(int i = Math.Min(index, _pages.Length - 1); i > 0; i--) { _pages[i] = _pages[i - 1]; } return _pages[0] = new MemoryMappedPage(this, pageIndex, _bufferManager.Storage.CreateViewStream(_storagePosition + (pageIndex * PageSize), PageSize)); } }