Pergunta sobre c#, .net, multithreading – Qual valor é a propriedade ThreadState?

3

Essa questão me fez pensar sobre o equivalente do .NET. Que valor existe para oThreadState propriedade da classe Thread? Neste exemplo de código:

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

osomeThread'sThreadState propriedade poderia mudar paraRunning Entre oif e o código dentro doif, certo?

Sua resposta

3   a resposta
4

ThreadState é uma daquelas propriedades fantásticas que parecem promissoras no começo, mas uma vez que você mergulha profundamente na maneira em que funciona, você acha que é quase totalmente inútil.

O principal problema com ThreadState é que os nomes de enumeração são muito enganosos. Por exemplo, pegue ThreadState.Runnning. Este é um nome muito ruim porque na verdade não indica que o encadeamento está sendo executado. Em vez disso, indica que o thread estava sendo executado em algum momento no passado recente e pode ou não estar sendo executado.

Isso pode parecer trivial, mas não é. É muito fácil pegar os nomes da enumeração literalmente e produz um código muito bonito. No entanto, assim como as leituras de código, geralmente são baseadas em lógica falha.

Eu realmente só uso essa propriedade para fins de depuração.

Este valor pode ser útil em conjuntos muito limitados de cenários onde você tem algum outro mecanismo que controla o encadeamento que você está olhando. Tal como um bloqueio ou WaitHandle. Mas geralmente é melhor usar outra forma de sincronização do que confiar nessa propriedade.

2

DeMSDN:

Nota importante:
Existem duas enumerações de estado de thread, System.Threading.ThreadState e System.Diagnostics.ThreadState. As enumerações de estado de encadeamento são de interesse apenas em alguns cenários de depuração. Seu código nunca deve usar o estado do encadeamento para sincronizar as atividades dos encadeamentos.

A menos que você esteja depurando, ignore ThreadState; não é uma solução para nada. Kevin Montrose
Então, por que eu estaria interessado nisso e o que eu faria para resolver o problema de sincronização? jasonh
1

O ThreadState é útil para examinar o depurador, a fim de ajudar a entender e depurar certos tipos de bugs de bloqueio / sincronização. Por exemplo, você pode saber se um segmento específico está bloqueado no depurador observando isso e vendo o ThreadState definido como ThreadState.WaitSleepJoin.

Dito isto, é algo que eu quase nunca confio. Eu tive resultados mistos tentando depurar usando isso, então, em geral, acho que na maioria das vezes é melhor fingir que não existe.

Perguntas relacionadas