private Task ProcessCompilationUnitCompleted(CompilationUnitCompletedEvent completedEvent, CancellationToken cancellationToken) { // When the compiler is finished with a compilation unit, we can run user diagnostics which // might want to ask the compiler for all the diagnostics in the source file, for example // to get information about unnecessary usings. try { // Execute analyzers in parallel. var tasks = ArrayBuilder <Task> .GetInstance(); var semanticModel = completedEvent.SemanticModel; foreach (var analyzerAndActions in _semanticModelActionsMap) { var task = Task.Run(() => { // Execute actions for a given analyzer sequentially. analyzerExecutor.ExecuteSemanticModelActions(analyzerAndActions.Value, semanticModel); }, cancellationToken); tasks.Add(task); } return(Task.WhenAll(tasks.ToArrayAndFree())); } finally { completedEvent.FlushCache(); } }