зависание .net в приложении.События

#.net #freeze #doevents

#.net #зависание #события

Вопрос:

Одним из наших устаревших продуктов является приложение Winforms, и вместо использования фоновых потоков оно выполняет все в основном потоке пользовательского интерфейса. В этом главном потоке выполняется постоянный цикл, который вызывает Application.DoEvents() каждые 20 мс. Время от времени приложение просто зависает при вызове DoEvents. Мой вопрос в том, как мне узнать, в каком вызове события в очереди зависает код?

P.S. Кто-нибудь знает инструмент, который я могу использовать для получения трассировки стека каждого потока в процессе?

Кроме того, это происходит только на рабочем клиенте, и мы должны исправить это сейчас. Также нет возможности установить VS на клиенте.

Комментарии:

1. Этот код нуждается в серьезном рефакторинге.

2. Зависает ли оно во время отладки?

3. Инструмент называется Visual Studio. Вы приостанавливаете процесс и переходите к окну потоков.

4. Если все сделано в потоке пользовательского интерфейса, вам нужно только получить трассировку стека потока пользовательского интерфейса.

5. Я во-вторых, @ Tejs, время для анализа проблемы лучше потратить на рефакторинг вашей формы. По сути, вам нужно переместить цикл в фоновый рабочий поток и изменить любой вызов из фонового потока на поток пользовательского интерфейса, чтобы он использовал шаблон BeginInvoke.

Ответ №1:

Вы можете сделать это в Visual Studio, просто подключившись к процессу, прервав выполнение и открыв окна потоков.

Меню: Отладка-> Windows-> Потоки

Комментарии:

1. К сожалению, это не сработает. Проблема возникает у клиента, и мы не можем воспроизвести ее внутри компании или установить VS на их компьютере. Я отредактирую исходный вопрос.

Ответ №2:

Я нашел инструмент, который искал. WinDbg

Он может получить трассировки стека для текущего запущенного процесса Windows. Однако для этого требуются файлы PDB для этого приложения.