Разрыв одной нити - PullRequest
       26

Разрыв одной нити

21 голосов
/ 06 августа 2010

Можно ли разорвать один поток в Visual Studio, в то время как другие потоки продолжат свое выполнение?

У меня есть один фоновый поток, который выполняет простую отправку / получение данных, что я и хотел бы сделать, проходя через мой код в каком-то другом потоке.

Ответы [ 5 ]

12 голосов
/ 06 августа 2010

откройте представление потока (Debug-> Windows-> Threads), щелкните правой кнопкой мыши по потоку, который вы хотите приостановить, выберите «Freeze». Выберите «Оттепель», чтобы вернуть его в рабочее состояние.

7 голосов
/ 04 апреля 2011

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

Базовое решение Как уже упоминалось в другом месте, повторяя последовательность: Заморозить, Возобновить (ждать), Пауза, Оттепель, Шаг должен привести к описанному вами поведению, предоставляя другим потокам возможность работать в фоновом режиме, пока ваш целевой поток остановлен.

У этого подхода есть как минимум две проблемы:

  • Это довольно утомительно
  • Ваши фоновые потоки будут приостановлены всякий раз, когда отладчик приостановлен.

Улучшения

Первая проблема может быть решена с помощью другой процедуры: введите Thread.Sleep(10000) в Immediate Window, эффективно удерживая сфокусированный поток занятым, в то время как другие потоки работают нормально.Вы даже можете привязать эту команду к макросу.

Вторая проблема может быть решена только с помощью подхода, который не должен останавливать отладчик.Но как мы будем проверять состояние, когда сессия не приостановлена?Вот где приходит IntelliTrace , но вы можете обнаружить, что вам нужно создать пользовательских событий IntelliTrace .Недостаток этого подхода заключается в том, что вы не можете вручную изменять состояние в полете.

1 голос
/ 21 апреля 2012

Установите счетчик, который увеличивает значение каждого созданного потока, а затем установите точку останова, чтобы нарушить условие и выберите значение для этого счетчика.Я не думаю, что это будет работать во всех случаях, особенно в PLINQ, но должно быть выполнимо во многих ситуациях.

0 голосов
/ 08 января 2015

Вы всегда можете поставить условную точку останова на основе свойства вашего текущего потока (например, имени или идентификатора).

Вы также можете найти это полезным: http://www.codeproject.com/Tips/396617/Conditional-Breakpoint-using-Make-Object-Id-featur

Это сработало для меня в VS2008 и должно работать аналогичным образом в 2010 году, по крайней мере

0 голосов
/ 06 августа 2010

Все, что я могу найти для этого, это то, что вы можете изменить поведение на уровне процесса , установив

  • Инструменты - Параметры - Отладка - Общие - Прерывать все процессы, когда один процесс прерывается

но не на базе потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...