Hello,
I am working on an ArcGIS 2.4.1 Pro AddIn that processes CPU-intensive tasks. One of the tasks is to create Polygons from parts of different PolyLines, which I achieved with the following code (shortened to the minimal relevant part):
PolylineBuilder polylineBuilder = new PolylineBuilder(SpatialReference);
polylineBuilder.AddParts(contourPolyLine.Parts);
polylineBuilder.SplitAtDistance(splitDistance, false, true);
var newPolygon3D = PolygonBuilder.CreatePolygon(polylineBuilder.ToGeometry()
.Copy3DCoordinatesToList(), SpatialReference);
This works just fine by itself, but took 40 minutes to process for about 3.000 objects. As this is run within QueuedTask.Run(async () =>...), ArcGIS Pro only utilized 1 CPU core of my 8 core machine. All attempts of separating the work and running several parallel tasks failed so far, because PolylineBuilder can not be used in a regular Task.Run(...)-Thread (Exception is thrown: "This object must be created within the lambda passed to QueuedTask.Run, or on a compatible STA thread.").
I had a look at ProConcepts Framework · Esri/arcgis-pro-sdk Wiki · GitHub and searched the community samples but couldn't find a similar scenario.
In another ArcGIS AddIn I was able to use 100% of the CPU by creating multiple threads that each take a part of the workload, but in that case I had only calculations with regular managed code and no ArcGIS Pro Tools were involved:
await Task.WhenAll(Enumerable.Range(1, Environment.ProcessorCount).Select(c => Task.Run( () => { DoWork(); }
Is there a solution to utilize the full CPU also for jobs that use ArcGIS.Core.Geometry Tools/Classes like PolylineBuilder?
Any hint or example would be appreciated.
Cheers