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?

Ondrej Janacek
źródło

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.

Powiedz
źródło
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ń).

Kristian Williams
źródło
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.

Feng Zhang
źródło
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