From 9a3da275c0627e16aed11515948a2d86d482ce97 Mon Sep 17 00:00:00 2001 From: ClemensFischer Date: Tue, 9 Sep 2025 08:18:25 +0200 Subject: [PATCH] Update GroundOverlay.cs --- MapControl/Shared/GroundOverlay.cs | 42 ++++++++++++++++-------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/MapControl/Shared/GroundOverlay.cs b/MapControl/Shared/GroundOverlay.cs index 91992940..fb22d0d0 100644 --- a/MapControl/Shared/GroundOverlay.cs +++ b/MapControl/Shared/GroundOverlay.cs @@ -129,43 +129,39 @@ namespace MapControl private static async Task> LoadImageOverlaysFromArchive(string archiveFilePath) { - List imageOverlays; - using (var archive = ZipFile.OpenRead(archiveFilePath)) { var docEntry = archive.GetEntry("doc.kml") ?? archive.Entries.FirstOrDefault(e => e.Name.EndsWith(".kml")) ?? throw new ArgumentException($"No KML entry found in {archiveFilePath}."); + XDocument document; using (var docStream = docEntry.Open()) { - imageOverlays = await ReadImageOverlays(docStream); + document = await LoadXDocument(docStream); } - await LoadImageOverlays(imageOverlays, imageOverlay => imageOverlay.LoadImage(archive)); + return await LoadImageOverlays(document, imageOverlay => imageOverlay.LoadImage(archive)); } - - return imageOverlays; } private static async Task> LoadImageOverlaysFromFile(string docFilePath) { - List imageOverlays; - var docUri = new Uri(FilePath.GetFullPath(docFilePath)); + XDocument document; using (var docStream = File.OpenRead(docUri.AbsolutePath)) { - imageOverlays = await ReadImageOverlays(docStream); + document = await LoadXDocument(docStream); } - await LoadImageOverlays(imageOverlays, imageOverlay => imageOverlay.LoadImage(docUri)); - - return imageOverlays; + return await LoadImageOverlays(document, imageOverlay => imageOverlay.LoadImage(docUri)); } - private static Task LoadImageOverlays(List imageOverlays, Func loadFunc) + private static async Task> LoadImageOverlays(XDocument document, Func loadFunc) { + var imageOverlays = ReadImageOverlays(document); + var semaphore = new SemaphoreSlim(MaxLoadTasks); var tasks = imageOverlays.Select(async imageOverlay => @@ -181,16 +177,13 @@ namespace MapControl } }); - return Task.WhenAll(tasks); + await Task.WhenAll(tasks); + + return imageOverlays; } - private static async Task> ReadImageOverlays(Stream docStream) + private static List ReadImageOverlays(XDocument document) { -#if NETFRAMEWORK - var document = await Task.Run(() => XDocument.Load(docStream, LoadOptions.None)); -#else - var document = await XDocument.LoadAsync(docStream, LoadOptions.None, System.Threading.CancellationToken.None); -#endif var rootElement = document.Root; var ns = rootElement.Name.Namespace; var docElement = rootElement.Element(ns + "Document") ?? rootElement; @@ -267,5 +260,14 @@ namespace MapControl return new LatLonBox(south, west, north, east, rotation); } + + private static Task LoadXDocument(Stream docStream) + { +#if NETFRAMEWORK + return Task.Run(() => XDocument.Load(docStream, LoadOptions.None)); +#else + return XDocument.LoadAsync(docStream, LoadOptions.None, System.Threading.CancellationToken.None); +#endif + } } }