Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to Handle GP Tool Execution Result Asynchronously in ArcEngine with Background 64bit #19

Open
Aqulia opened this issue Nov 28, 2024 · 0 comments

Comments

@Aqulia
Copy link

Aqulia commented Nov 28, 2024

I am using ArcEngine with background 64bit and calling GP tools using the ExecuteAsync event. I want to continue processing the results of the GP tool execution after it finishes. Following the official example of gp.ToolExecuted to monitor the execution status of the GP tool, I noticed that the event within gp.ToolExecuted is triggered only after the main function completes. How can I modify my code to handle the GP tool's results immediately after execution, without waiting for the main function to finish?
`private async void btnRunGP_Click(object sender, EventArgs e)
{
try
{
#region tidy up any previous gp runs
//Clear the ListView control
listView1.Items.Clear();
//Remove any result layers present in the map
IMapLayers mapLayers = axMapControl1.Map as IMapLayers;
foreach (IFeatureLayer resultLayer in _resultsList)
{
mapLayers.DeleteLayer(resultLayer);
}
axTOCControl1.Update();

    _resultsList.Clear();
    
    _myGPToolsToExecute.Clear();
    #endregion
    ESRI.ArcGIS.AnalysisTools.Buffer bufferTool = new ESRI.ArcGIS.AnalysisTools.Buffer();
    bufferTool.in_features = _layersDict["Cities"];
    bufferTool.buffer_distance_or_field = txtBufferDistance.Text + " Miles";
    bufferTool.out_feature_class = "city_buffer.shp";
    ESRI.ArcGIS.AnalysisTools.Clip clipTool = new ESRI.ArcGIS.AnalysisTools.Clip();
    clipTool.in_features = _layersDict["ZipCodes"];
    clipTool.clip_features = bufferTool.out_feature_class;
    clipTool.out_feature_class = "city_buffer_clip.shp";
    _myGPToolsToExecute.Enqueue(bufferTool);
    _myGPToolsToExecute.Enqueue(clipTool);
     _gp.ExecuteAsync(_myGPToolsToExecute.Dequeue());
    //I want to do something after executeAsync,but I dont want to put them in ToolExecuted
    MessageBox.show("finish")

}
catch (Exception ex)
{
    listView1.Items.Add(new ListViewItem(new string[2] { "N/A", ex.Message }, "error"));
}

}
void _gp_ToolExecuted(object sender, ToolExecutedEventArgs e)
{
IGeoProcessorResult2 gpResult = (IGeoProcessorResult2)e.GPResult;

try
{
    //The first GP tool has completed, if it was successful process the others
    if (gpResult.Status == esriJobStatus.esriJobSucceeded)
    {
        listView1.Items.Add(new ListViewItem(new string[2] { "ToolExecuted", gpResult.Process.Tool.Name }, "success"));

        //Execute next tool in the queue
        if (_myGPToolsToExecute.Count > 0)
        {
            _gp.ExecuteAsync(_myGPToolsToExecute.Dequeue());
        }
        //If last tool has executed add the output layer to the map
        else
        {
            IFeatureClass resultFClass = _gp.Open(gpResult.ReturnValue) as IFeatureClass;
            IFeatureLayer resultLayer = new FeatureLayerClass();
            resultLayer.FeatureClass = resultFClass;
            resultLayer.Name = resultFClass.AliasName;

            //Add the result to the map
            axMapControl1.AddLayer((ILayer)resultLayer, 2);
            axTOCControl1.Update();

            //add the result layer to the List of result layers
            _resultsList.Add(resultLayer);
        }
    }
    //If the GP process failed, do not try to process any more tools in the queue
    else if (gpResult.Status == esriJobStatus.esriJobFailed)
    {
        //The actual GP error message will be output by the MessagesCreated event handler
        listView1.Items.Add(new ListViewItem(new string[2] { "ToolExecuted", gpResult.Process.Tool.Name + " failed, any remaining processes will not be executed." }, "error"));
        //Empty the queue
        _myGPToolsToExecute.Clear();
    }
}
catch (Exception ex)
{
    listView1.Items.Add(new ListViewItem(new string[2] { "ToolExecuted", ex.Message }, "error"));
}

}`

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant