Pytanie w sprawie .net, c#, multithreading – Jaką wartością jest właściwość obiektu ThreadState?

3

To pytanie pomyślałem o ekwiwalencie .NET. Jaka jest wartośćThreadState właściwość klasy Thread? W tym przykładzie kodu:

<code>if (someThread.ThreadState != System.Threading.ThreadState.Running)
{
    someThread = new Thread(SomeMethod);
    someThread.Start();
}
</code>

ThesomeThreadjestThreadState właściwość może się przełączyć naRunning pomiędzyif i kod wewnątrzif, dobrze?

Twoja odpowiedź

3   odpowiedź
1

ThreadState jest przydatny do przeglądania debuggera, aby pomóc w zrozumieniu i debugowaniu niektórych rodzajów błędów blokowania / synchronizacji. Na przykład, możesz stwierdzić, czy konkretny wątek jest zablokowany w debuggerze, patrząc na to, i widząc stan ThreadState ustawiony na ThreadState.WaitSleepJoin.

Powiedziawszy to, jest to coś, na czym prawie nigdy nie polegam. Miałem mieszane wyniki próbowania debugowania za pomocą tego, więc ogólnie myślę, że naprawdę najlepiej jest udawać, że nie istnieje.

4

ThreadState jest jedną z tych fantastycznych właściwości, które na pierwszy rzut oka wyglądają obiecująco, ale kiedy zanurzysz się głęboko w sposobie działania, odkryjesz, że jest prawie całkowicie bezużyteczny.

Głównym problemem związanym z funkcją ThreadState jest to, że nazwy wyliczeń są bardzo mylące. Na przykład weź ThreadState.Runnning. To naprawdę zła nazwa, ponieważ w rzeczywistości nie wskazuje, że wątek jest uruchomiony. Zamiast tego wskazuje, że wątek był uruchomiony w pewnym momencie w ostatnim czasie i może nadal działać.

Może się to wydawać trywialne, ale tak nie jest. Naprawdę łatwo jest dosłownie pobrać nazwy wyliczenia i uzyskać naprawdę ładnie wyglądający kod. Jednak tak samo jak kod, często opiera się na błędnej logice.

Naprawdę używam tej właściwości tylko do celów debugowania.

Ta wartość może być użyteczna w bardzo ograniczonych zestawach scenariuszy, w których masz jakiś inny mechanizm, który kontroluje wątek, na który patrzysz. Takich jak zamek lub WaitHandle. Ale zazwyczaj lepiej jest użyć innej formy synchronizacji niż poleganie na tej właściwości.

2

ZMSDN:

Ważna uwaga:
Istnieją dwa wyliczenia stanu wątków: System.Threading.ThreadState i System.Diagnostics.ThreadState. Wyliczenia stanu wątków są interesujące tylko w kilku scenariuszach debugowania. Twój kod nie powinien nigdy używać stanu wątków do synchronizowania działań wątków.

Jeśli nie debugujesz, zignoruj ​​ThreadState; to nie jest rozwiązanie niczego. Kevin Montrose
Dlaczego więc miałbym się tym interesować i co bym zrobił, aby rozwiązać problem synchronizacji? jasonh

Powiązane pytania