﻿# PVS\-Studio C\#: что делать, если подготовка проектов идёт слишком долго или зависает?

Некоторые пользователи C\# анализатора PVS\-Studio сталкивались с тем, что этап подготовки проектов либо работает очень долго, либо вообще зависает\. В этой заметке мы рассмотрим, как могла проявляться проблема и как мы её починили\.

## В чём заключалась проблема?

Проблема могла проявляться по\-разному в зависимости от того, где используется C\# анализатор \(Visual Studio, Rider, command line\)\. Типичный признак, как я упоминал выше, – этап подготовки проектов идёт либо очень долго, либо вообще не завершается\.

**Visual Studio**

О зависании свидетельствует следующее окно, в котором прогресс либо не движется, либо движется очень медленно:

![0864_CsEvaluationOptimizations_ru/image1.png](https://import.viva64.com/docx/blog/0864_CsEvaluationOptimizations_ru/image1.png)

**Rider**

В окне "Background Tasks" выполняется шаг "PVS\-Studio: Preparing for analysis", но прогресса нет:

![0864_CsEvaluationOptimizations_ru/image2.png](https://import.viva64.com/docx/blog/0864_CsEvaluationOptimizations_ru/image2.png)

**Command\-line \(PVS\-Studio\_Cmd\.exe / pvs\-studio\-dotnet\)**

При запуске консольной версии \(PVS\-Studio\_Cmd\.exe для Windows или pvs\-studio\-dotnet для Linux или macOS\) после запуска анализатора нет никакого прогресса \(даже при использовании флага '\-\-progress'\):

![0864_CsEvaluationOptimizations_ru/image3.png](https://import.viva64.com/docx/blog/0864_CsEvaluationOptimizations_ru/image3.png)

## Причина

В анализаторе есть код, который разбирает зависимости проектов друг от друга, в том числе транзитивные\. И всё бы неплохо, вот только не учитывалось, какие проекты уже были обработаны, какие \- нет\. В итоге для одного и того же проекта обработка могла запускаться раз за разом, если он часто появлялся в транзитивных зависимостях других проектов\.

Допустим, у нас есть 3 проекта: 'A', 'B', 'C'\. 'A' зависит от 'B' и 'C', 'B' зависит от 'C', 'C' ни от чего не зависит\. В итоге получалась такая логика\. При анализе 'C' мы будем обрабатывать 1 проект \(сам 'C'\), в случае с 'B' \- 2 проекта \('B' и 'C'\), в случае с 'A' \- 4 проекта \(сам 'А', 'B' и 'C' как прямые зависимости, 'C' как транзитивную зависимость по проекту 'B'\)\. Понимаете, да, какая последовательность вырисовывается? 1, 2, 4, 8, 16, 32, 64\.\.\.

В итоге доводилось видеть, как анализатор пытался разобрать сотни тысяч и даже миллионы зависимостей\. Если везло, анализатор просто работал долго, если не везло \- этап подготовки проекта мог не проходить даже за несколько суток\.

Решение оказалось максимально простым \- не обрабатываем повторно одни и те же проекты\.

Эта простая правка решила проблемы сразу нескольких пользователей: 

* некоторые писали, что у них в принципе стал проходить этот этап, хотя раньше анализатор попросту зависал на нём;
* у кого\-то этап подготовки проектов стал работать намного быстрее\. Например, 4 минуты вместо 2 часов\.

## Что делать?

### При использовании PVS\-Studio версии 7\.14 или более старой

В таком случае вам нужно просто обновиться до более свежей версии анализатора:

* попробуйте PVS\-Studio 7\.15 или более новую версию, если она доступна на момент чтения этой заметки\. Посмотреть последнюю доступную версию, а также загрузить нужный дистрибутив, можно на [соответствующей странице](https://pvs-studio.ru/ru/pvs-studio/download-all/)\.
* если релиз 7\.15 ещё не состоялся, [напишите нам](https://pvs-studio.ru/ru/about-feedback/?is_question_form_open=true)\. Мы выдадим бета\-версию анализатора, где проблема решена\.

### При использовании PVS\-Studio версии 7\.15 или более новой

В таком случае вы столкнулись с другой проблемой, о которой мы ещё не знаем\. Пожалуйста, [напишите нам в поддержку](https://pvs-studio.ru/ru/about-feedback/?is_question_form_open=true) \- будем разбираться\.