Co to jest kod zakończenia wątku?


115

Czym dokładnie jest kod zakończenia wątku w oknie danych wyjściowych podczas debugowania? Jakie informacje mi daje? Czy jest to w jakiś sposób przydatne, czy tylko wewnętrzna rzecz, która nie powinna mi przeszkadzać?

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

Czy może jest jakaś lista możliwych kodów wyjścia wraz z jej znaczeniem?

Odpowiedzi:


100

Wydaje się, że nie ma wielu wyjaśnień na ten temat, ale kody wyjścia mają być używane do wskazania, jak wątek wyszedł, 0 zwykle oznacza, że ​​wyszedł bezpiecznie, podczas gdy cokolwiek innego zwykle oznacza, że ​​tak się nie stało nie wyjdź zgodnie z oczekiwaniami. Ale wtedy ten kod wyjścia można ustawić samodzielnie w kodzie, aby całkowicie to przeoczyć.

Najbliższy link, który mogłem znaleźć przydatny, aby uzyskać więcej informacji, to to

Cytat z powyższego linku:

Niezależnie od metody zakończenia, liczba całkowita, którą zwracasz z procesu lub wątku, musi mieć wartości z zakresu 0-255 (8 bitów). Wartość zerowa oznacza sukces, a wartość niezerowa oznacza niepowodzenie. Chociaż można spróbować zwrócić dowolną wartość całkowitą jako kod zakończenia, tylko najniższy bajt liczby całkowitej jest zwracany z procesu lub wątku jako część kodu zakończenia. Bajty wyższego rzędu są używane przez system operacyjny do przekazywania specjalnych informacji o procesie. Kod zakończenia jest bardzo przydatny w programach wsadowych / powłokowych, które warunkowo wykonują inne programy w zależności od sukcesu lub niepowodzenia jednego z nich.


Z dokumentacji dla GetEXitCodeThread

Ważne Funkcja GetExitCodeThread zwraca prawidłowy kod błędu zdefiniowany przez aplikację dopiero po zakończeniu wątku. Dlatego aplikacja nie powinna używać STILL_ACTIVE (259) jako kodu błędu. Jeśli wątek zwróci STILL_ACTIVE (259) jako kod błędu, aplikacje, które testują tę wartość, mogą zinterpretować ją jako oznaczającą, że wątek nadal działa i kontynuują testowanie zakończenia wątku po zakończeniu wątku, co może spowodować umieszczenie aplikacji w nieskończoną pętlę.


Rozumiem to wszystko, że kod zakończenia nie ma większego znaczenia, jeśli używasz wątków we własnej aplikacji dla własnej aplikacji. Wyjątkiem jest prawdopodobnie sytuacja, w której uruchamiasz kilka wątków w tym samym czasie, które są od siebie zależne. Jeśli istnieje wymóg, aby zewnętrzne źródło odczytywało ten kod błędu, możesz ustawić go tak, aby informował inne aplikacje o stanie Twojego wątku.


1
Czy istnieje sposób na pozbycie się go z okna Output?
Arne Evertsson

26
@ArneEvertsson - Jeśli przejdziesz do Narzędzia | Opcje ... w obszarze „Debugging \ Output Window” znajduje się ustawienie „Thread Exit Messages” (On | Off).
josh poley

2
Może to oznaczać, że używasz metod asynchronicznych w głównym wątku aplikacji synchronicznej i nie czekasz na ich zakończenie. Najłatwiejszym sposobem rozwiązania tego problemu jest wywołanie funkcji Wait () w zadaniu uruchomionym i zwróconym inną metodą, jak pokazano w tym przykładzie: asp.net/web-api/overview/advanced/ ...RunAsync().Wait();
Bron Davies

1
Wątek puli wątków @BronDavies kończy działanie z kodem błędu 259 nawet po wywołaniu Wait (). Oto mój kod: static void Main(string[] args) { var t = new Task<object>(() => SomeOp(2)); t.Start(); t.Wait(); }Chodzi o to, że zadania są wykonywane przez wątki puli wątków i na podstawie heurystyki puli wątków może nie zakończyć wątku nawet po zakończeniu zadania. Wątek po prostu wraca do puli wątków oczekujących na przydzielenie do następnego zadania. Dlatego kod zakończenia STILL_ACTIVE (259) brzmi tutaj tak intuicyjnie.
RBT

Artykuł w linku jest nieprawidłowy. Nie ma wymagania, aby kod zakończenia wątku (lub kod zakończenia procesu, jeśli o to chodzi) był tylko jednym bajtem.
Harry Johnston

55

Jak wspomniał Sayse, kod zakończenia 259 (0x103)ma specjalne znaczenie, w tym przypadku debugowany proces nadal działa.

Widziałem to często w przypadku debugowania usług internetowych, ponieważ wątek nadal działa po wykonaniu każdego wywołania usługi sieciowej (ponieważ nadal nasłuchuje kolejnych wywołań).


7
Więcej informacji .. generalnie każdy wątek należący do puli wątków zostanie zakończony z 259. Zobacz: stackoverflow.com/questions/21632584/…
Skrymsli

Zastanawiałem się, co to oznacza, a Twoja odpowiedź była dokładnie tym, co widziałem podczas uruchamiania mojej aplikacji konsoli C #. Dzięki!
kayleeFrye_onDeck

0

przydarzyło mi się to, że w moim rozwiązaniu jest wiele projektów. Chciałem debugować projekt 1, jednak projekt 2 został ustawiony jako domyślny projekt początkowy. Naprawiłem to przez kliknięcie prawym przyciskiem myszy na projekcie i wybranie „Ustaw jako projekt startowy”, a następnie uruchomienie debugowania jest w porządku.


1
Nie widzę komunikatów debugowania w oknie danych wyjściowych jako problemów. Byłem po prostu ciekawy, czym one są, a nie jak się ich pozbyć.
Ondrej Janacek
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.