diff --git a/MapControl/Shared/GroundOverlay.cs b/MapControl/Shared/GroundOverlay.cs index 09a126dd..168418be 100644 --- a/MapControl/Shared/GroundOverlay.cs +++ b/MapControl/Shared/GroundOverlay.cs @@ -48,13 +48,20 @@ namespace MapControl if (entry != null) { + MemoryStream memoryStream; + + // ZipArchive does not support multithreading, synchronously copy ZipArchiveEntry stream to MemoryStream. + // using (var zipStream = entry.Open()) - using (var memoryStream = new MemoryStream((int)zipStream.Length)) { - zipStream.CopyTo(memoryStream); // CopyToAsync won't work with ZipArchive + memoryStream = new MemoryStream((int)zipStream.Length); + zipStream.CopyTo(memoryStream); memoryStream.Seek(0, SeekOrigin.Begin); - imageSource = await ImageLoader.LoadImageAsync(memoryStream); } + + // Close Zip Stream before awaiting. + // + imageSource = await ImageLoader.LoadImageAsync(memoryStream); } } diff --git a/MapControl/Shared/ImageLoader.cs b/MapControl/Shared/ImageLoader.cs index 868ca7d7..7e392d22 100644 --- a/MapControl/Shared/ImageLoader.cs +++ b/MapControl/Shared/ImageLoader.cs @@ -31,12 +31,9 @@ namespace MapControl HttpClient.DefaultRequestHeaders.Add("User-Agent", $"XAML-Map-Control/{typeof(ImageLoader).Assembly.GetName().Version}"); } - public static async Task LoadImageAsync(byte[] buffer) + public static Task LoadImageAsync(byte[] buffer) { - using (var stream = new MemoryStream(buffer)) - { - return await LoadImageAsync(stream); - } + return LoadImageAsync(new MemoryStream(buffer)); } public static async Task LoadImageAsync(Uri uri, IProgress progress = null) diff --git a/MapControl/WinUI/ImageLoader.WinUI.cs b/MapControl/WinUI/ImageLoader.WinUI.cs index e73315d8..a0c2e3c5 100644 --- a/MapControl/WinUI/ImageLoader.WinUI.cs +++ b/MapControl/WinUI/ImageLoader.WinUI.cs @@ -78,11 +78,9 @@ namespace MapControl if (response?.Buffer != null) { - using (var memoryStream = new MemoryStream(response.Buffer)) - using (var randomAccessStream = memoryStream.AsRandomAccessStream()) + using (var stream = new MemoryStream(response.Buffer).AsRandomAccessStream()) { - var decoder = await BitmapDecoder.CreateAsync(randomAccessStream); - + var decoder = await BitmapDecoder.CreateAsync(stream); bitmap = await LoadWriteableBitmapAsync(decoder); } }