Вопрос по c#, .net, multithreading – Какое значение имеет свойство ThreadState?

3

Этот вопрос заставил меня задуматься о .NET эквиваленте. Какое значение дляThreadState свойство класса Thread? В этом примере кода:

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

someThread& APOS; sThreadState свойство может переключиться наRunning междуif и код внутриif, право?

Ваш Ответ

3   ответа
4

которые на первый взгляд кажутся многообещающими, но как только вы углубляетесь в то, как в функциях вы обнаруживаете, что оно почти полностью бесполезно.

Основная проблема с ThreadState заключается в том, что имена перечислений вводят в заблуждение. Например, возьмите ThreadState.Runnning. Это действительно плохое имя, потому что оно не означает, что поток работает. Вместо этого это указывает, что поток работал в некоторый момент в недавнем прошлом и может или не может все еще работать.

Это может показаться тривиальным, но это не так. Очень легко буквально воспринимать имена перечислений и создавать действительно красивый код. Однако, как и код чтения, он часто основан на некорректной логике.

Я действительно использую это свойство только для целей отладки.

Это значение может быть полезно в очень ограниченных наборах сценариев, где у вас есть какой-то другой механизм, который контролирует поток, который вы просматриваете. Такие как блокировка или WaitHandle. Но обычно лучше использовать другую форму синхронизации, чем полагаться на это свойство.

2

MSDN:

Important Note:
There are two thread state enumerations, System.Threading.ThreadState and System.Diagnostics.ThreadState. The thread state enumerations are only of interest in a few debugging scenarios. Your code should never use thread state to synchronize the activities of threads.

Error: User Rate Limit Exceeded jasonh
Error: User Rate Limit Exceeded
1

чтобы помочь понять и отладить определенные типы ошибок блокировки / синхронизации. Например, вы можете узнать, заблокирован ли определенный поток в отладчике, посмотрев на это, и увидев, что для ThreadState установлено значение ThreadState.WaitSleepJoin.

При этом я почти никогда не полагаюсь на это. У меня были неоднозначные результаты при попытке отладки с использованием этого, так что, в общем, я думаю, что чаще всего лучше всего делать вид, что его не существует.

Похожие вопросы