Hi,
I`m currently working on a more complex SOE process that runs on our latest ArcGIS Server version 10.6.1 much slower then ever before. The process includes several Raster Geoprocessing Functions which are time consuming and currently processed synchronously without 64 bit background processing. I would really like to migrate this to an asynchronous background process but I can't figure out how to bring this together. Async/await doesn't seem to work with the common SOE project layout.
This is the major logic:
RestOperation doMyJob <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">RestOperation</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">"doMyJob"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">string</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="punctuation token">{</SPAN> <SPAN class="string token">"param1"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"param2"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"param3"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"param4"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"param5"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"param6"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"param7"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"param8"</SPAN> <SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">string</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="punctuation token">{</SPAN> <SPAN class="string token">"json"</SPAN> <SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">,</SPAN> doMyJobOperationHandler<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="keyword token">private</SPAN> <SPAN class="keyword token">byte</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="token function">doMyJobOperationHandler</SPAN><SPAN class="punctuation token">(</SPAN>NameValueCollection boundVariables<SPAN class="punctuation token">,</SPAN>
JsonObject operationInput<SPAN class="punctuation token">,</SPAN>
<SPAN class="keyword token">string</SPAN> outputFormat<SPAN class="punctuation token">,</SPAN>
<SPAN class="keyword token">string</SPAN> requestProperties<SPAN class="punctuation token">,</SPAN>
<SPAN class="keyword token">out</SPAN> <SPAN class="keyword token">string</SPAN> responseProperties<SPAN class="punctuation token">)</SPAN>
<SPAN class="punctuation token">{</SPAN>
<SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN> <SPAN class="keyword token">do</SPAN> a lot of stuff here
<SPAN class="keyword token">return</SPAN> <SPAN class="token function">getCutFillAreas</SPAN><SPAN class="punctuation token">(</SPAN>p_strDatasetName<SPAN class="punctuation token">,</SPAN> p_Polygon<SPAN class="punctuation token">,</SPAN> b_dBaseZ<SPAN class="punctuation token">,</SPAN> p_dZFactor<SPAN class="punctuation token">,</SPAN> p_bCreateFC<SPAN class="punctuation token">,</SPAN> p_strConstantRasterPath<SPAN class="punctuation token">,</SPAN> p_strCutFillRasterPath<SPAN class="punctuation token">,</SPAN> p_strClippedRasterPath<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</SPAN>
<SPAN class="keyword token">private</SPAN> <SPAN class="keyword token">byte</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="token function">getCutFillAreas</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="keyword token">string</SPAN> paramA<SPAN class="punctuation token">,</SPAN> IPolygon4 polygon<SPAN class="punctuation token">,</SPAN> <SPAN class="keyword token">double</SPAN> z<SPAN class="punctuation token">,</SPAN> <SPAN class="keyword token">double</SPAN> zFactor<SPAN class="punctuation token">,</SPAN> <SPAN class="keyword token">bool</SPAN> createFC<SPAN class="punctuation token">,</SPAN> <SPAN class="keyword token">string</SPAN> constRasterPath<SPAN class="punctuation token">,</SPAN> <SPAN class="keyword token">string</SPAN> cutFillRasterPath<SPAN class="punctuation token">,</SPAN> <SPAN class="keyword token">string</SPAN> clippedRasterPath<SPAN class="punctuation token">)</SPAN>
<SPAN class="punctuation token">{</SPAN>
JsonObject resultJsonObject <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">JsonObject</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="keyword token">do</SPAN> a lot of stuff here
<SPAN class="token function">executeClipTool</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN>IRaster<SPAN class="punctuation token">)</SPAN> iGeoDataset<SPAN class="punctuation token">,</SPAN> clippedRasterPath<SPAN class="punctuation token">,</SPAN> clippingEnv<SPAN class="punctuation token">)</SPAN>
<SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="keyword token">continue</SPAN> here after clipping <SPAN class="keyword token">is</SPAN> done
<SPAN class="token function">executeAnotherGeoprocessingTool</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="keyword token">continue</SPAN>
<SPAN class="keyword token">return</SPAN> Encoding<SPAN class="punctuation token">.</SPAN>UTF8<SPAN class="punctuation token">.</SPAN><SPAN class="token function">GetBytes</SPAN><SPAN class="punctuation token">(</SPAN>someJsonObject<SPAN class="punctuation token">.</SPAN><SPAN class="token function">ToJson</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</SPAN>
<SPAN class="keyword token">private</SPAN> <SPAN class="keyword token">void</SPAN> <SPAN class="token function">executeClipTool</SPAN><SPAN class="punctuation token">(</SPAN>IRaster inRaster<SPAN class="punctuation token">,</SPAN> <SPAN class="keyword token">string</SPAN> outRasterPath<SPAN class="punctuation token">,</SPAN> IEnvelope rectangle<SPAN class="punctuation token">)</SPAN>
<SPAN class="punctuation token">{</SPAN>
Geoprocessor GP <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">Geoprocessor</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
Clip l_clipTool <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">Clip</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
l_clipTool<SPAN class="punctuation token">.</SPAN>in_raster <SPAN class="operator token">=</SPAN> inRaster<SPAN class="punctuation token">;</SPAN>
l_clipTool<SPAN class="punctuation token">.</SPAN>out_raster <SPAN class="operator token">=</SPAN> outRasterPath<SPAN class="punctuation token">;</SPAN>
l_clipTool<SPAN class="punctuation token">.</SPAN>rectangle <SPAN class="operator token">=</SPAN> Math<SPAN class="punctuation token">.</SPAN><SPAN class="token function">Round</SPAN><SPAN class="punctuation token">(</SPAN>rectangle<SPAN class="punctuation token">.</SPAN>XMin<SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">+</SPAN> <SPAN class="string token">", "</SPAN> <SPAN class="operator token">+</SPAN>
Math<SPAN class="punctuation token">.</SPAN><SPAN class="token function">Round</SPAN><SPAN class="punctuation token">(</SPAN>p_rectangle<SPAN class="punctuation token">.</SPAN>YMin<SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">+</SPAN> <SPAN class="string token">", "</SPAN> <SPAN class="operator token">+</SPAN>
Math<SPAN class="punctuation token">.</SPAN><SPAN class="token function">Round</SPAN><SPAN class="punctuation token">(</SPAN>p_rectangle<SPAN class="punctuation token">.</SPAN>XMax<SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">+</SPAN> <SPAN class="string token">", "</SPAN> <SPAN class="operator token">+</SPAN>
Math<SPAN class="punctuation token">.</SPAN><SPAN class="token function">Round</SPAN><SPAN class="punctuation token">(</SPAN>p_rectangle<SPAN class="punctuation token">.</SPAN>YMax<SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="token function">executeGeoprocessingTool</SPAN><SPAN class="punctuation token">(</SPAN>GP<SPAN class="punctuation token">,</SPAN> l_clipTool<SPAN class="punctuation token">,</SPAN> <SPAN class="keyword token">null</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>This is very simplified but it shows what I want to do. Basically I execute the tools synchronously and access results afterwards through file access.
Now I want to have my main function getCutFillAreas to run executeClipTool() and other functions with Geoprocessor as asynchronous Tasks. I tried
var result = executeClipToolAsync((IRaster) iGeoDataset, clippedRasterPath, clippingEnv).Result
with a Task<T> approach
Task<SPAN class="operator token"><</SPAN><SPAN class="keyword token">bool</SPAN><SPAN class="operator token">></SPAN> clippingTask <SPAN class="operator token">=</SPAN> Task<SPAN class="punctuation token">.</SPAN>Factory<SPAN class="punctuation token">.</SPAN><SPAN class="token function">StartNew</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN>
<SPAN class="punctuation token">{</SPAN>
<SPAN class="keyword token">return</SPAN> <SPAN class="keyword token">true</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</SPAN>
<SPAN class="keyword token">return</SPAN> <SPAN class="keyword token">await</SPAN> clippingTask<SPAN class="punctuation token">;</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>but then I get Task error.
Any help would be very appreciated!