From 8b94625b57fc786a5036654b65a7f58bd791b6e1 Mon Sep 17 00:00:00 2001 From: ClemensFischer Date: Mon, 8 Sep 2025 23:09:14 +0200 Subject: [PATCH] Update GroundOverlay.cs --- MapControl/Shared/GroundOverlay.cs | 42 +++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/MapControl/Shared/GroundOverlay.cs b/MapControl/Shared/GroundOverlay.cs index 4d33e0a9..7b4ca544 100644 --- a/MapControl/Shared/GroundOverlay.cs +++ b/MapControl/Shared/GroundOverlay.cs @@ -7,6 +7,8 @@ using System.IO.Compression; using System.Linq; using System.Threading.Tasks; using System.Xml.Linq; +using System.Threading; + #if WPF using System.Windows; using System.Windows.Controls; @@ -69,6 +71,8 @@ namespace MapControl private static ILogger logger; private static ILogger Logger => logger ?? (logger = ImageLoader.LoggerFactory?.CreateLogger()); + public static int MaxLoadTasks { get; set; } = 4; + public static readonly DependencyProperty SourcePathProperty = DependencyPropertyHelper.Register(nameof(SourcePath), null, async (groundOverlay, oldValue, newValue) => await groundOverlay.LoadAsync(newValue)); @@ -100,11 +104,11 @@ namespace MapControl if (ext == ".kmz") { - imageOverlays = await LoadGroundOverlaysFromArchive(sourcePath); + imageOverlays = await LoadImageOverlaysFromArchive(sourcePath); } else if (ext == ".kml") { - imageOverlays = await LoadGroundOverlaysFromFile(sourcePath); + imageOverlays = await LoadImageOverlaysFromFile(sourcePath); } } catch (Exception ex) @@ -124,7 +128,7 @@ namespace MapControl } } - private static async Task> LoadGroundOverlaysFromArchive(string archiveFilePath) + private static async Task> LoadImageOverlaysFromArchive(string archiveFilePath) { List imageOverlays; @@ -136,16 +140,16 @@ namespace MapControl using (var docStream = docEntry.Open()) { - imageOverlays = await ReadGroundOverlays(docStream); + imageOverlays = await ReadImageOverlays(docStream); } - await Task.WhenAll(imageOverlays.Select(imageOverlay => imageOverlay.LoadImage(archive))); + await LoadImageOverlays(imageOverlays, imageOverlay => imageOverlay.LoadImage(archive)); } return imageOverlays; } - private static async Task> LoadGroundOverlaysFromFile(string docFilePath) + private static async Task> LoadImageOverlaysFromFile(string docFilePath) { List imageOverlays; @@ -153,15 +157,35 @@ namespace MapControl using (var docStream = File.OpenRead(docUri.AbsolutePath)) { - imageOverlays = await ReadGroundOverlays(docStream); + imageOverlays = await ReadImageOverlays(docStream); } - await Task.WhenAll(imageOverlays.Select(imageOverlay => imageOverlay.LoadImage(docUri))); + await LoadImageOverlays(imageOverlays, imageOverlay => imageOverlay.LoadImage(docUri)); return imageOverlays; } - private static async Task> ReadGroundOverlays(Stream docStream) + private static Task LoadImageOverlays(List imageOverlays, Func loadFunc) + { + var semaphore = new SemaphoreSlim(MaxLoadTasks); + + var tasks = imageOverlays.Select(async imageOverlay => + { + await semaphore.WaitAsync(); + try + { + await loadFunc(imageOverlay); // no more than MaxLoadTasks parallel executions here + } + finally + { + semaphore.Release(); + } + }); + + return Task.WhenAll(tasks); + } + + private static async Task> ReadImageOverlays(Stream docStream) { #if NETFRAMEWORK var document = await Task.Run(() => XDocument.Load(docStream, LoadOptions.None));