public async Task<IEnumerable<IProjectMetric>> Calculate(Solution solution)
{
var tasks = (from project in solution.Projects
where project != null
let compilation = project.GetCompilationAsync()
select new { project, compilation })
.AsArray();
await Task.WhenAll(tasks.Select(x => x.compilation)).ConfigureAwait(false);
var calculationTasks = tasks.Select(x => InnerCalculate(x.project, x.compilation, solution));
return await Task.WhenAll(calculationTasks).ConfigureAwait(false);
}