Date: 28.12.2020 5:21:55
ThreadState.WaitSleepJoin соответствует внутреннему состоянию TS_Interruptible в CLR: https://github.com/dotnet/runtime/blob/master/src/coreclr/vm/comsynchronizable.cpp#L673. В это состояние поток переходит, когда вызывается один из методов ожидания в .NET: WaitHandle.WaitOne, Thread.Sleep, Monitor.Enter и другие. Но функция GetMessage является функцией Windows, и при ее вызове этот флаг не устанавливается, хотя она также переводит поток в состояние ожидания прерывания. С точки зрения CLR, поток остается в состоянии Running. А System.Diagnostics.ThreadState считывает реальное состояние потока ОС через счетчики производительности, поэтому оно всегда вернет актуальное значение.
Автор: VadimTagil