public FeatureSet Query(Geometry geometry, string layerURL) { if (Dispatcher.CheckAccess()) { var message = string.Format("\"Query\" method should be called on background thread."); throw new Exception(message); } FeatureSet result = null; Exception error = null; var manualResetEvent = new ManualResetEvent(false); Dispatcher.Invoke(() => { var queryTask = new QueryTask(layerURL); var query = new Query(); query.OutFields.Add("*"); query.Geometry = geometry; query.ReturnGeometry = true; query.OutSpatialReference = Map.SpatialReference; EventHandler<TaskFailedEventArgs> onTaskFailed = null; EventHandler<QueryEventArgs> onExecuteCompleted = null; onTaskFailed = (s, a) => { queryTask.ExecuteCompleted -= onExecuteCompleted; queryTask.Failed -= onTaskFailed; error = a.Error; manualResetEvent.Set(); }; onExecuteCompleted = (s, a) => { queryTask.ExecuteCompleted -= onExecuteCompleted; queryTask.Failed -= onTaskFailed; result = a.FeatureSet; manualResetEvent.Set(); }; queryTask.ExecuteCompleted += onExecuteCompleted; queryTask.Failed += onTaskFailed; queryTask.ExecuteAsync(query); }); manualResetEvent.WaitOne(); if (error == null) { return result; } else { throw error; } }
backgroundWorker.DoWork += (s, a) => { [your code here] var featureSet = Query(geometry, layerURL); [your code here using featureSet] var maybeAnotherFeatureSet = Query(geometry2, layerURL2); [you code here using both feature sets] }; backgroundWorker.RunWorkerCompleted += (s, a) => { [output results and throw errors here] }; backgroundWorker.RunWorkerAsync();
Signed in members can post, follow updates, and more. New here? Register a free account.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.