Что такое код выхода потока?

Что такое код выхода потока в окне вывода во время отладки? Какую информацию он мне дает? Это как-то полезно или просто внутренние вещи, которые не должны меня беспокоить?

The thread 0x552c has exited with code 259 (0x103).
The thread 0x4440 has exited with code 0 (0x0).

Может быть, есть какой-то список возможных кодов выхода вместе с их значением?


person Ondrej Janacek    schedule 19.09.2013    source источник


Ответы (3)


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

Ближайшая ссылка, которую я смог найти для получения дополнительной информации, — это это

Цитата из ссылки выше:

Каким бы ни был метод выхода, целое число, которое вы возвращаете из своего процесса или потока, должно иметь значения от 0 до 255 (8 бит). Нулевое значение указывает на успех, а ненулевое значение указывает на сбой. Хотя вы можете попытаться вернуть любое целочисленное значение в качестве кода выхода, только младший байт целого числа возвращается из вашего процесса или потока как часть кода выхода. Байты более высокого порядка используются операционной системой для передачи специальной информации о процессе. Код выхода очень полезен в пакетных программах/программах оболочки, которые условно запускают другие программы в зависимости от успеха или неудачи одной из них.


Из документации для GetEXitCodeThread

Важно! Функция GetExitCodeThread возвращает допустимый код ошибки, определенный приложением, только после завершения потока. Поэтому приложение не должно использовать STILL_ACTIVE (259) в качестве кода ошибки. Если поток возвращает STILL_ACTIVE (259) в качестве кода ошибки, приложения, которые проверяют это значение, могут интерпретировать его как означающее, что поток все еще выполняется, и продолжать проверять завершение потока после завершения потока. завершено, что может привести к бесконечному циклу приложения.


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

person Sayse    schedule 19.09.2013
comment
Есть ли способ избавиться от него из окна вывода? - person Arne Evertsson; 10.01.2014
comment
@ArneEvertsson - Если вы войдете в Инструменты | Параметры... в области Окно отладки\вывода есть параметр Сообщения о выходе из потока (Вкл. | Выкл.). - person josh poley; 01.07.2014
comment
Это может означать, что вы используете асинхронные методы в основном потоке синхронного приложения и не ждете их завершения. Самый простой способ справиться с этим — вызвать Wait() для задачи, запущенной и возвращенной другим методом, как показано в этом примере: asp.net/web-api/overview/advanced/ RunAsync().Wait(); - person Bron Davies; 26.08.2015
comment
Поток пула потоков @BronDavies завершается с кодом ошибки 259 даже после вызова Wait(). Вот мой код: static void Main(string[] args) { var t = new Task<object>(() => SomeOp(2)); t.Start(); t.Wait(); } Дело в том, что задачи выполняются потоками пула потоков, и на основе эвристики пула потоков поток может не завершиться даже после завершения вашей задачи. Поток просто возвращается в пул потоков, ожидающих назначения следующей задачи. И именно поэтому код выхода STILL_ACTIVE (259) звучит здесь так интуитивно понятно. - person RBT; 14.02.2016
comment
Статья по ссылке неверная. Нет требования, чтобы код выхода потока (или код выхода процесса, если уж на то пошло) состоял только из одного байта. - person Harry Johnston; 20.04.2017
comment
Это может быть связано с этим вопросом: ссылка. Я получил код выхода 259 при попытке построить и запустить решение, и оно не запустилось. Я снял флажок «Свойства» › › «Отладка» › › «Включить процесс размещения Visual Studio», как в ответе @EatAtJoes. Я видел MyProject.vshost.exe в диспетчере задач и не мог его убить. Отключение процесса хостинга и сохранение решения избавили от задачи в живых процессах, а также избавились от сообщений 259, и мое решение заработало нормально. - person DanG; 02.06.2017

Как упоминал Сэйс, код выхода 259 (0x103) имеет особое значение, в этом случае отлаживаемый процесс все еще выполняется.

Я часто видел это при отладке веб-сервисов, потому что поток продолжает работать после выполнения каждого вызова веб-сервиса (поскольку он все еще ожидает дальнейших вызовов).

person Kristian Williams    schedule 30.12.2013
comment
Дополнительная информация. Как правило, любой поток, принадлежащий пулу потоков, завершится с кодом 259. См.: stackoverflow.com/questions/21632584/ - person Skrymsli; 21.08.2014
comment
Мне было интересно, что это значит, и ваш ответ был именно тем, что я видел, когда запускал консольное приложение C#. Спасибо! - person kayleeFrye_onDeck; 10.06.2015

что случилось со мной, так это то, что у меня есть несколько проектов в моем решении. Я хотел отладить проект 1, однако проект 2 был установлен в качестве начального проекта по умолчанию. Я исправил это, щелкнув правой кнопкой мыши проект и выбрав «Установить как стартовый проект», после чего запуск отладки в порядке.

person Feng Zhang    schedule 22.06.2015
comment
Я не вижу отладочные сообщения в окне вывода как проблемы. Мне просто было интересно, что они собой представляют, а не как от них избавиться. - person Ondrej Janacek; 24.06.2015