public void Request(int bandNo, TileId[] tiles) { if (tiles == null) { return; } int count = tiles.Length; for (int i = 0; i < count; i++) { TileTask task = new TileTask(); task.Tile = tiles[i]; task.BandNo = bandNo; task.Key = GetTileTaskKey(bandNo, tiles[i]); //插入读取队列 _taskStack.Push(task); } //重新启动读取线程 if (_workerIsFinisehd) { _isStarted = false; Start(); } if (_isDoingLargerTask) { _needPauseLargerTask = true; } }
private void DoTileTask(TileTask tileTask) { TileData data = TryReadFromCacheFile(tileTask); if (data != null) { if (_tileReadedCallback != null) { _tileReadedCallback.BeginInvoke(data, null, null); } } else { /* * 缓存文件不存在,选择以下方式: * 1.直接从IRasterDataProvider中读取 * 2.加入待通知队列,相应的BandLevelTask完成后异步通知内存缓存管理对象 */ //1. DirectTileFromDataProvider(tileTask); //2. //_needAsyncNotifyTasks.Add(tileTask.Key); // //Console.WriteLine(tileTask.Tile.ToString() + ",缓存文件不存在。"); } }
public void LoadSync(int bandNo, LevelId level) { if (level.TileCount == 0 || level.Tiles == null || level.Tiles.Length == 0) { return; } for (int i = 0; i < level.Tiles.Length; i++) { TileTask task = new TileTask(); task.Tile = level.Tiles[i]; task.BandNo = bandNo; task.Key = GetTileTaskKey(bandNo, level.Tiles[i]); DoTileTask(task); } }
private TileData TryReadFromCacheFile(TileTask tileTask) { string fname = _cacheNameHelper.GetCacheFilename(_cacheFolder, tileTask.BandNo, tileTask.Tile.LevelNo); if (!File.Exists(fname)) { return(null); } int offset = tileTask.Tile.Index * _tileSize * _tileSize * _dataTypeSize; FileStream fs = null; // string key = _cacheNameHelper.GetResourceKey(tileTask.BandNo, tileTask.Tile.LevelNo); if (_readFileStreams.ContainsKey(key)) { fs = _readFileStreams[key]; } else { fs = new FileStream(fname, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); _readFileStreams.Add(key, fs); } //要请求的块还未写入文件 if (fs.Length < offset) { return(null); } // fs.Seek(offset, SeekOrigin.Begin); byte[] buffer = new byte[_tileSize * _tileSize * _dataTypeSize]; fs.Read(buffer, 0, buffer.Length); // TileData data = new TileData(); data.BandNo = tileTask.BandNo; data.Data = buffer; data.Tile = tileTask.Tile; return(data); }
private unsafe void DirectTileFromDataProvider(TileTask tileTask) { byte[] data = new byte[_tileBufferSize]; fixed(byte *ptr = data) { IntPtr buffer = new IntPtr(ptr); TileId tile = tileTask.Tile; LevelId lv = _tileComputer.Levels[tile.LevelNo]; _dataProvider.GetRasterBand(tileTask.BandNo).Read( (int)(_tileSize * tile.Col / lv.Scale), (int)(_tileSize * tile.Row / lv.Scale), (int)(tile.Width / lv.Scale), (int)(tile.Height / lv.Scale), buffer, _dataProvider.DataType, tile.Width, tile.Height); // TileData tileData = new TileData(); tileData.BandNo = tileTask.BandNo; tileData.Tile = tile; tileData.Data = data; _tileReadedCallback(tileData); } }