Quale valore è la proprietà ThreadState?

Questa domanda mi ha fatto pensare all’equivalente .NET. Quale valore è presente nella proprietà ThreadState della class Thread? In questo esempio di codice:

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

La proprietà ThreadState someThread potrebbe passare a Running tra if e il codice all’interno di if , giusto?

ThreadState è una di quelle proprietà fantastiche che sembrano promettenti all’inizio, ma una volta che ti immergi nel modo in cui nelle funzioni, scopri che è quasi totalmente inutile.

Il problema principale con ThreadState è che i nomi delle enumerazioni sono molto fuorvianti. Ad esempio, prendi ThreadState.Runnning. Questo è davvero un brutto nome perché in realtà non indica che il thread è in esecuzione. Invece indica che il thread era in esecuzione in un determinato momento nel passato recente e potrebbe non essere ancora in esecuzione.

Questo può sembrare banale ma non lo è. È davvero facile prendere i nomi dell’enumerazione letteralmente e produrre codice davvero bello. Tuttavia, come pure il codice legge, è spesso basato su una logica imperfetta.

In realtà utilizzo solo questa proprietà a scopo di debug.

Questo valore può essere utile in serie molto limitate di scenari in cui si dispone di un altro meccanismo che controlla il thread che si sta guardando. Come una serratura o WaitHandle. Ma di solito è meglio usare un’altra forma di sincronizzazione piuttosto che fare affidamento su questa proprietà.

Da MSDN :

Nota importante:
Esistono due enumerazioni dello stato dei thread, System.Threading.ThreadState e System.Diagnostics.ThreadState. Le enumerazioni dello stato dei thread interessano solo alcuni scenari di debug. Il tuo codice non dovrebbe mai utilizzare lo stato del thread per sincronizzare le attività dei thread.

ThreadState è utile per cercare nel debugger, al fine di aiutare a capire e correggere alcuni tipi di bug di blocco / sincronizzazione. Ad esempio, è ansible stabilire se un thread specifico è bloccato nel debugger osservando questo e vedendo ThreadState impostato su ThreadState.WaitSleepJoin.

Detto questo, è qualcosa su cui non mi baso quasi mai. Ho avuto risultati contrastanti cercando di eseguire il debug usando questo, quindi in generale, penso che sia il più delle volte meglio fingere che non esista.