ThreadState属性有什么价值?

时间:2009-06-17 23:32:52

标签: c# .net multithreading

This question让我想到了.NET等价物。 Thread类的ThreadState属性有什么价值?在此代码示例中:

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

someThread的{​​{1}}媒体资源可以在ThreadStateRunning内的代码之间切换为if,对吗?

3 个答案:

答案 0 :(得分:4)

ThreadState是最初看起来很有前途的奇妙属性之一,但是一旦你深入了解函数的方式,你会发现它几乎完全没用。

ThreadState的主要问题是枚举名称非常容易引起误解。例如,使用ThreadState.Runnning。这是一个非常糟糕的名称,因为它实际上并不表示线程正在运行。相反,它表示线程在最近的某个时刻正在运行,可能会或可能不会仍在运行。

这看似微不足道,但事实并非如此。从字面上理解枚举的名称并生成非常漂亮的代码非常容易。然而,除了代码读取,它通常基于有缺陷的逻辑。

我实际上只是将此属性用于调试目的。

此值在非常有限的场景集中非常有用,在这些场景中,您有一些其他机制可以控制您正在查看的线程。如lock或WaitHandle。但通常使用其他形式的同步比依赖此属性更好。

答案 1 :(得分:2)

来自MSDN

  

重要说明:
      有两个线程状态枚举,   System.Threading.ThreadState和   System.Diagnostics.ThreadState。       线程状态枚举仅在一些调试中引起关注   场景。       您的代码永远不应该使用线程状态来同步活动   线程。

答案 2 :(得分:1)

ThreadState对于在调试器中查看非常有用,以帮助理解和调试某些类型的阻塞/同步错误。例如,您可以通过查看调试器中的特定线程是否被阻塞,并将ThreadState设置为ThreadState.WaitSleepJoin。

话虽如此,这是我几乎从不依赖的东西。我尝试使用它进行调试的结果好坏参半,所以一般来说,我认为通常最好假装它不存在。