diff --git a/src/Toolkit/Toolkit/UI/Controls/BasemapGallery/BasemapGalleryController.cs b/src/Toolkit/Toolkit/UI/Controls/BasemapGallery/BasemapGalleryController.cs index fb30d1b75..6129a0d8d 100644 --- a/src/Toolkit/Toolkit/UI/Controls/BasemapGallery/BasemapGalleryController.cs +++ b/src/Toolkit/Toolkit/UI/Controls/BasemapGallery/BasemapGalleryController.cs @@ -197,20 +197,34 @@ private async Task HandlePortalChanged() await UpdateBasemaps(); } + private bool _pendingUpdateBasemaps; + public async Task UpdateBasemaps() { + _pendingUpdateBasemaps = true; + if (IsLoading) + return; + IsLoading = true; - // Cancel any pending load before starting a new one - _loadCancellationTokenSource?.Cancel(); - _loadCancellationTokenSource = new CancellationTokenSource(); try { - _availableBasemaps = await PopulateBasemaps(_loadCancellationTokenSource.Token); - HandleAvailableBasemapsChanged(); - } - catch (Exception ex) - { - System.Diagnostics.Trace.WriteLine(ex.Message); + while (_pendingUpdateBasemaps) + { + _pendingUpdateBasemaps = false; + + _loadCancellationTokenSource?.Cancel(); + _loadCancellationTokenSource = new CancellationTokenSource(); + try + { + _availableBasemaps = await PopulateBasemaps(_loadCancellationTokenSource.Token); + HandleAvailableBasemapsChanged(); + } + catch (OperationCanceledException) { } + catch (Exception ex) + { + System.Diagnostics.Trace.WriteLine(ex.Message); + } + } } finally { @@ -284,18 +298,7 @@ private static bool BasemapIsActuallyNotABasemap(Basemap input) return await LoadBasemapGalleryItems(Portal, cancellationToken); } - private Task> LoadBasemapGalleryItems(ArcGISPortal portal, CancellationToken cancellationToken = default) - { - if (_loadBasemapGalleryItemsTask is null || _loadBasemapGalleryItemsTask.IsCompleted) - { - _loadBasemapGalleryItemsTask = LoadBasemapGalleryItemsInternal(portal, cancellationToken); - return _loadBasemapGalleryItemsTask; - } - - return _loadBasemapGalleryItemsTask; - } - - private async Task> LoadBasemapGalleryItemsInternal(ArcGISPortal portal, CancellationToken cancellationToken = default) + private async Task> LoadBasemapGalleryItems(ArcGISPortal portal, CancellationToken cancellationToken = default) { async Task> LoadBasemapsAsync(Func>> getBasemapsFunc) {