CalculateGraphMetricsAsyncInternal
(
CalculateGraphMetricsAsyncArgs oCalculateGraphMetricsAsyncArgs,
BackgroundWorker oBackgroundWorker,
DoWorkEventArgs oDoWorkEventArgs
)
{
Debug.Assert(oCalculateGraphMetricsAsyncArgs != null);
Debug.Assert(oBackgroundWorker != null);
Debug.Assert(oDoWorkEventArgs != null);
AssertValid();
IGraph oGraph = oCalculateGraphMetricsAsyncArgs.Graph;
List<GraphMetricColumn> oAggregatedGraphMetricColumns =
new List<GraphMetricColumn>();
CalculateGraphMetricsContext oCalculateGraphMetricsContext =
new CalculateGraphMetricsContext(
oCalculateGraphMetricsAsyncArgs.GraphMetricUserSettings,
oBackgroundWorker);
Boolean bDuplicateEdgesRemoved = false;
foreach (IGraphMetricCalculator2 oGraphMetricCalculator in
oCalculateGraphMetricsAsyncArgs.SortedGraphMetricCalculators)
{
if (!oGraphMetricCalculator.HandlesDuplicateEdges &&
!bDuplicateEdgesRemoved)
{
// This and the remainder of the graph metric calculators
// cannot handle duplicate edges. Remove them from the graph.
oGraph.Edges.RemoveDuplicates();
bDuplicateEdgesRemoved = true;
}
// Calculate the implementation's graph metrics.
GraphMetricColumn [] aoGraphMetricColumns;
if ( !oGraphMetricCalculator.TryCalculateGraphMetrics(oGraph,
oCalculateGraphMetricsContext, out aoGraphMetricColumns) )
{
// The user cancelled.
oDoWorkEventArgs.Cancel = true;
oBackgroundWorker.ReportProgress(0,
new GraphMetricProgress("Cancelled.", false)
);
return;
}
// Aggregate the results.
Debug.Assert(aoGraphMetricColumns != null);
oAggregatedGraphMetricColumns.AddRange(aoGraphMetricColumns);
}
oDoWorkEventArgs.Result = oAggregatedGraphMetricColumns.ToArray();
oBackgroundWorker.ReportProgress(100,
new GraphMetricProgress(
"Inserting metrics into the workbook.",
true)
);
// Let the dialog the display the final progress report and update its
// controls.
System.Threading.Thread.Sleep(1);
}