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();
        }