使用BackgroundWorker时无过载

时间:2014-03-10 14:42:10

标签: c# wpf multithreading backgroundworker

当我尝试向地图添加大量图形时,我收到了ContextSwitchDeadlock。我很想使用BackgroundWorker Class,因为我从来没有机会,但我不知道如何处理这种情况。

C#:

private void AttributeSearchButton_Click(object sender, RoutedEventArgs e)
        {
            BackgroundWorker bw = new BackgroundWorker();
            bw.WorkerReportsProgress = true;
            bw.WorkerSupportsCancellation = true;
            bw.DoWork += new DoWorkEventHandler(RunQuery);
            bw.ProgressChanged += new ProgressChangedEventHandler(ProgressChanged);

        }

        private void RunQuery(object sender, DoWorkEventArgs e)
        {
            _attributeQueryGraphicsLayer.Graphics.Clear();

            QueryTask queryTask = new QueryTask("http://xx.x.x.xxx:6080/arcgis/rest/services/Calvert_City_Test/MapServer/2");
            queryTask.ExecuteCompleted += GeneralQueryTask_ExecuteCompleted;
            queryTask.Failed += GeneralQueryTask_Failed;

            var dirty = DateTime.UtcNow;
            Query query = new Query();
            query.OutFields.Add("*");
            query.ReturnGeometry = true;
            query.Where = "CIS_METR LIKE '%" + QueryParametersTextbox.Text + "%' OR COMMENTS LIKE '%" + QueryParametersTextbox.Text + "%'";
            query.OutSpatialReference = MyMap.SpatialReference;               
            queryTask.ExecuteAsync(query);



        }

        // Draw results when query is complete
        private void GeneralQueryTask_ExecuteCompleted(object sender, ESRI.ArcGIS.Client.Tasks.QueryEventArgs args)
        {
            // Clear previous results
            QueryDataGrid.Visibility = Visibility.Visible;
            GraphicsLayer graphicsLayer = MyMap.Layers["QueryResults"] as GraphicsLayer;
            graphicsLayer.ClearGraphics();

            // Check for new results 

            FeatureSet featureSet = args.FeatureSet;
            bool isExceedTransferLimit = args.ExceededTransferLimit;

            try
            {
                if (featureSet.Features.Count > 0 && isExceedTransferLimit == false)
                {
                    // Add results to map
                    foreach (Graphic resultFeature in featureSet.Features)
                    {
                        //resultFeature.Symbol = ResultsFillSymbol;
                        graphicsLayer.Graphics.Add(resultFeature);
                    }
                }
                else
                {
                    MessageBox.Show("No features found");
                }

            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

        // Notify when query fails
        private void GeneralQueryTask_Failed(object sender, TaskFailedEventArgs args)
        {
            MessageBox.Show("Query failed: " + args.Error);
        }

        private void ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.ProgressTextbox.Content = (e.ProgressPercentage.ToString() + "%");
        }

我知道逻辑是关闭的,但我对如何修复它一无所知。我已经提到了http://msdn.microsoft.com/en-us/library/System.ComponentModel.BackgroundWorker(v=vs.95).aspx有关如何使用该类的帮助,但是所提供的信息并不适用于这种特定情况。 我想做什么:

当用户单击“搜索”按钮时,它将运行查询。这非常有效。问题是当它运行GeneralQueryTask_ExecuteCompleted时,如果有大量记录,我会收到ContextSwitchDeadlock消息。这也使UI无响应。

根据我的阅读,我需要提出:

if (worker.CancellationPending == true)
{
    e.Cancel = true;
    break;
}

执行耗时的任务。问题是我没有重载方法可以执行QueryTask和BackgroundWorker。任何帮助,将不胜感激。如果您需要更多信息,请告诉我。

0 个答案:

没有答案