From 9e33282d0794c284aeb5eb2ce0f985fad4efcb4e Mon Sep 17 00:00:00 2001 From: ClemensFischer Date: Thu, 4 Sep 2025 08:11:15 +0200 Subject: [PATCH] GroundOverlay performance --- MapControl/Avalonia/ImageLoader.Avalonia.cs | 2 +- MapControl/Shared/GroundOverlay.cs | 35 ++++++++++++--------- MapControl/WPF/ImageLoader.WPF.cs | 2 +- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/MapControl/Avalonia/ImageLoader.Avalonia.cs b/MapControl/Avalonia/ImageLoader.Avalonia.cs index d50dca81..9986fc1b 100644 --- a/MapControl/Avalonia/ImageLoader.Avalonia.cs +++ b/MapControl/Avalonia/ImageLoader.Avalonia.cs @@ -22,7 +22,7 @@ namespace MapControl public static Task LoadImageAsync(Stream stream) { - return Task.FromResult(LoadImage(stream)); + return Task.Run(() => LoadImage(stream)); } public static async Task LoadImageAsync(string path) diff --git a/MapControl/Shared/GroundOverlay.cs b/MapControl/Shared/GroundOverlay.cs index fe70e681..8ed1b4f5 100644 --- a/MapControl/Shared/GroundOverlay.cs +++ b/MapControl/Shared/GroundOverlay.cs @@ -37,7 +37,21 @@ namespace MapControl ZIndex = zIndex; } - public async Task Load() + public async Task LoadStream(ZipArchive archive) + { + var entry = archive.GetEntry(ImagePath); + + if (entry != null) + { + using (var zipStream = entry.Open()) + { + Stream = new MemoryStream((int)zipStream.Length); + await zipStream.CopyToAsync(Stream); + } + } + } + + public async Task LoadImage() { if (Stream != null) { @@ -46,7 +60,7 @@ namespace MapControl } } - public async Task Load(Uri docUri) + public async Task LoadImage(Uri docUri) { ImageSource = await ImageLoader.LoadImageAsync(new Uri(docUri, ImagePath)); } @@ -141,19 +155,10 @@ namespace MapControl foreach (var imageOverlay in imageOverlays) { - var imageEntry = archive.GetEntry(imageOverlay.ImagePath); - - if (imageEntry != null) - { - using (var zipStream = imageEntry.Open()) - { - imageOverlay.Stream = new MemoryStream((int)zipStream.Length); - await zipStream.CopyToAsync(imageOverlay.Stream); - } - } + await imageOverlay.LoadStream(archive); } - Parallel.ForEach(imageOverlays, async imageOverlay => await imageOverlay.Load()); + await Task.WhenAll(imageOverlays.Select(imageOverlay => imageOverlay.LoadImage())); return imageOverlays; } @@ -172,7 +177,7 @@ namespace MapControl var docUri = new Uri(docFilePath); - Parallel.ForEach(imageOverlays, async imageOverlay => await imageOverlay.Load(docUri)); + await Task.WhenAll(imageOverlays.Select(imageOverlay => imageOverlay.LoadImage(docUri))); return imageOverlays; } @@ -180,7 +185,7 @@ namespace MapControl private static async Task> ReadGroundOverlays(Stream docStream) { #if NETFRAMEWORK - var document = await Task.FromResult(XDocument.Load(docStream, LoadOptions.None)); + var document = await Task.Run(() => XDocument.Load(docStream, LoadOptions.None)); #else var document = await XDocument.LoadAsync(docStream, LoadOptions.None, System.Threading.CancellationToken.None); #endif diff --git a/MapControl/WPF/ImageLoader.WPF.cs b/MapControl/WPF/ImageLoader.WPF.cs index e2224502..236ed9dd 100644 --- a/MapControl/WPF/ImageLoader.WPF.cs +++ b/MapControl/WPF/ImageLoader.WPF.cs @@ -29,7 +29,7 @@ namespace MapControl public static Task LoadImageAsync(Stream stream) { - return Task.FromResult(LoadImage(stream)); + return Task.Run(() => LoadImage(stream)); } public static async Task LoadImageAsync(string path)