Я бы посоветовал вам попробовать использовать отладчик Visual Studio, чтобы выяснить, что делает код.
Сначала убедитесь, что у вас установлен режим «Отладка» и что отладчик будет работать «Локальный компьютер» (здесь есть и другие варианты, но я стараюсь упростить задачу).

Затем нажмите «Локальный» Кнопка «Машина» для запуска вашего приложения с помощью отладчика.
После того, как ваше приложение зависнет, нажмите «Отладка-разрыв всех»:

После этого я предлагаю вам использовать различные команды Debug для дальнейшей отладки вашего приложения.

Например, вы можете использовать пункт меню / стек вызовов для просмотра того, что делает ваш код. Вы также можете использовать меню «Потоки», чтобы увидеть, какие потоки работают. Если в вашем коде есть подозрительные области, вы можете рассмотреть возможность добавления операторов System.Diagnostics.Debug.WriteLine () для распечатки информационных сообщений, а затем использовать пункт / окно меню «Вывод», чтобы увидеть, что происходит.
Если ваше приложение сначала зависает, а затем через некоторое время вылетает, это может быть связано с тем, что в ваших задачах нет правильной обработки исключений. Возможно, вы захотите добавить обработчик UnobservedTaskException в свой код, чтобы помочь вам найти эту проблему.