diff --git a/MapControl/Shared/TileImageLoader.cs b/MapControl/Shared/TileImageLoader.cs index 8504bc0e..7cd38592 100644 --- a/MapControl/Shared/TileImageLoader.cs +++ b/MapControl/Shared/TileImageLoader.cs @@ -13,16 +13,6 @@ using System.Threading.Tasks; namespace MapControl { -#if NETFRAMEWORK - static class ConcurrentQueueEx - { - public static void Clear(this ConcurrentQueue tileQueue) - { - while (tileQueue.TryDequeue(out _)) ; - } - } -#endif - /// /// Loads and optionally caches map tile images for a MapTileLayer. /// @@ -50,7 +40,7 @@ namespace MapControl /// public TileSource TileSource { get; private set; } - private ConcurrentQueue tileQueue; + private ConcurrentStack pendingTiles; /// /// Loads all pending tiles from the tiles collection. @@ -59,13 +49,13 @@ namespace MapControl /// public Task LoadTiles(IEnumerable tiles, TileSource tileSource, string cacheName) { - tileQueue?.Clear(); // stop download from current queue + pendingTiles?.Clear(); // stop download from current stack - tileQueue = new ConcurrentQueue(tiles.Where(tile => tile.Pending)); + pendingTiles = new ConcurrentStack(tiles.Where(tile => tile.Pending).Reverse()); TileSource = tileSource; - if (tileSource == null || tileQueue.IsEmpty) + if (tileSource == null || pendingTiles.IsEmpty) { return Task.CompletedTask; } @@ -79,15 +69,15 @@ namespace MapControl } var tasks = Enumerable - .Range(0, Math.Min(tileQueue.Count, MaxLoadTasks)) - .Select(_ => Task.Run(() => LoadTilesFromQueueAsync(tileQueue, tileSource, cacheName))); + .Range(0, Math.Min(pendingTiles.Count, MaxLoadTasks)) + .Select(_ => Task.Run(() => LoadPendingTilesAsync(pendingTiles, tileSource, cacheName))); return Task.WhenAll(tasks); } - private static async Task LoadTilesFromQueueAsync(ConcurrentQueue tileQueue, TileSource tileSource, string cacheName) + private static async Task LoadPendingTilesAsync(ConcurrentStack pendingTiles, TileSource tileSource, string cacheName) { - while (tileQueue.TryDequeue(out var tile)) + while (pendingTiles.TryPop(out var tile)) { tile.Pending = false; @@ -97,12 +87,12 @@ namespace MapControl } catch (Exception ex) { - Debug.WriteLine("TileImageLoader: {0}/{1}/{2}: {3}", tile.ZoomLevel, tile.XIndex, tile.Y, ex.Message); + Debug.WriteLine($"TileImageLoader: {tile.ZoomLevel}/{tile.XIndex}/{tile.Y}: {ex.Message}"); } } } - private static Task LoadTileAsync(Tile tile, TileSource tileSource, string cacheName) + private static Task LoadTileAsync(Tile tile, TileSource tileSource, string cacheName) { if (cacheName == null) {