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);
            }
        }