Що таке вихідний код потоку?


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) як код помилки, програми, які перевіряють це значення, можуть його інтерпретувати так, що нитка все ще працює, і продовжувати тестування на завершення потоку після припинення потоку, який міг би поставити додавання в нескінченну петлю.


Я розумію все це в тому, що вихідний код не має великого значення, якщо ви використовуєте теми у власній програмі для власного додатку. Виняток із цього, можливо, якщо ви запускаєте пару ниток одночасно, які залежать один від одного. Якщо для зовнішнього джерела є необхідність прочитати цей код помилки, ви можете встановити його, щоб інші програми дізнавались про стан вашої нитки.


1
Чи є спосіб позбутися від неї у вікні виводу?
Арне Евертссон

26
@ArneEvertsson - Якщо ви перейдете до Інструменти | Параметри ... в області "Налагодження \ Вихідне вікно" є налаштування "Повідомлення про вихід з потоку" (Увімкнено | Вимкнено).
josh poley

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

0

зі мною сталося те, що у мене є кілька проектів у своєму вирішенні. Я мав на увазі налагодити проект 1, однак проект 2 був встановлений як проект за замовчуванням. Я це виправив, клацнувши правою кнопкою миші на проект і виберіть "Встановити як проект запуску", тоді запускати налагодження добре.


1
Я не бачу налагодження повідомлень у вікні виводу як проблем. Мені просто цікаво, що вони, а не як їх позбутися.
Ондрей Яначек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.