private async static void ConstructPolygons() { List <CandidateDam> candidates = new List <CandidateDam>(); SharedFunctions.LoadDamCandidatesFromLayer(candidates, damLayer); List <Contour> contours = new List <Contour>(); SharedFunctions.LoadContoursFromLayer(contours, contourLayer); //select only contours, that actually have candidate dams on it contours = contours.Where(c => candidates.Any(d => d.ContourID == c.ObjectID)).ToList(); bool multiThreading = (Parameter.MultiThreadingBox == null || !Parameter.MultiThreadingBox.IsChecked.HasValue || Parameter.MultiThreadingBox.IsChecked.Value); //ArcGIS.Core.Geometry Tools currently don't seem to support multithreading. //Question https://community.esri.com/thread/243147-multithreading-parallel-processing-in-arcgis-pro-addin //received no answer so far. Until a solution is found, multithreading logic has to be deactivated multiThreading = false; if (multiThreading) { List <PolylineBuilder> polylineBuilders = new List <PolylineBuilder>(); for (int i = 0; i < Environment.ProcessorCount; i++) { polylineBuilders.Add(new PolylineBuilder(SpatialReference)); } ContoursToProcess = contours.Select(c => c.ObjectID).ToList(); SharedFunctions.Log("Divided work into " + Environment.ProcessorCount + " threads for all logical Processors..."); await Task.WhenAll(polylineBuilders.Select(c => Task.Run(//Enumerable.Range(1, Environment.ProcessorCount).Select(c => Task.Run( async() => { while (ContoursToProcess.Count > 0) { long contourID = -1; lock (ContoursToProcess) { contourID = ContoursToProcess.FirstOrDefault(); if (contourID != 0) { ContoursToProcess.Remove(contourID); } } if (contourID != -1) { var calc = new List <Contour>() { contours.Single(d => d.ObjectID == contourID) }; await PolygonsForContours(candidates, calc, c); } } } )) ); } else { await PolygonsForContours(candidates, contours, new PolylineBuilder(SpatialReference)); } SharedFunctions.Log("Save all " + surfaces.Count + " surfaces"); foreach (var surface in surfaces) { var attributes = new Dictionary <string, object> { { "Shape", surface.Polygon }, { "DamID", (long)surface.DamID }, { "ContourHeight", (short)surface.ContourHeight } }; var createOperation = new EditOperation() { Name = "Create reservoir polygon", SelectNewFeatures = false }; createOperation.Create(reservoirSurfacesLayer, attributes); await createOperation.ExecuteAsync(); } await Project.Current.SaveEditsAsync(); }