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

115

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

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

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

Ондрей Яначек
источник

Ответы:

100

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

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

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

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


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

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


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

Sayse
источник
1
Есть ли способ избавиться от него в окне вывода?
Арне Эвертссон
26
@ArneEvertsson - Если вы зайдете в Инструменты | Параметры ... в области «Отладка \ Окно вывода» есть параметр «Сообщения о выходе из потока» (Вкл | Выкл).
josh poley 01
2
Это может означать, что вы используете асинхронные методы в основном потоке синхронного приложения и не дожидаетесь их завершения. Самый простой способ справиться с этим - вызвать Wait () для задачи, запущенной и возвращенной другим методом, как показано в этом примере: asp.net/web-api/overview/advanced/… RunAsync().Wait();
Брон Дэвис
1
Поток пула потоков @BronDavies завершается с кодом ошибки 259 даже после вызова Wait (). Вот мой код: static void Main(string[] args) { var t = new Task<object>(() => SomeOp(2)); t.Start(); t.Wait(); }Дело в том, что задачи выполняются потоками пула потоков, и на основе эвристики пула потоков он может не завершить поток даже после завершения вашей задачи. Поток просто возвращается в пул потоков, ожидающих назначения следующей задачи. Вот почему код выхода STILL_ACTIVE (259) звучит здесь так интуитивно.
RBT
Статья в ссылке неправильная. Не требуется, чтобы код выхода потока (или код выхода процесса, если на то пошло) был только одним байтом.
Гарри Джонстон
55

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

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

Кристиан Уильямс
источник
7
Подробнее ... как правило, любой поток, принадлежащий пулу потоков, будет завершен с помощью 259. См .: stackoverflow.com/questions/21632584/…
Skrymsli
Мне было интересно, что это значит, и ваш ответ был именно тем, что я видел при запуске своего консольного приложения C #. Спасибо!
kayleeFrye_onDeck 09
0

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

Фэн Чжан
источник
1
Я не вижу отладочные сообщения в окне вывода как проблемы. Мне было просто любопытно, что это такое, а не как от них избавиться.
Ондрей Яначек,