2011-05-09 114 views
0

下面的代码条一的ThreadState四个最有用的价值之一:未开始,运行,WaitSleepJoin,并停止:这个线程状态函数是做什么的?

public static ThreadState SimpleThreadState (ThreadState ts) 
{ 
    return ts & (ThreadState.Unstarted | 
    ThreadState.WaitSleepJoin | 
    ThreadState.Stopped); 
} 

我在书上读到上面,但我不能肯定是作者想在这里说明。我已经测试象下面这样:

class Program 
{ 
    static void Main(string[] args) 
    { 
     System.Console.WriteLine(SimpleThreadState(ThreadState.Aborted)); 
     System.Console.WriteLine(SimpleThreadState(ThreadState.Background)); 
     System.Console.WriteLine(SimpleThreadState(ThreadState.AbortRequested)); 
     System.Console.WriteLine(SimpleThreadState(ThreadState.Suspended)); 
     System.Console.WriteLine(SimpleThreadState(ThreadState.Unstarted)); 
     System.Console.WriteLine(SimpleThreadState(ThreadState.WaitSleepJoin)); 
     System.Console.WriteLine(SimpleThreadState(ThreadState.Stopped)); 
    } 

public static ThreadState SimpleThreadState(ThreadState ts) 
{ 
    return ts & (ThreadState.Unstarted | 
     ThreadState.WaitSleepJoin | 
     ThreadState.Stopped); 
} 

}

这里是运行结果: 运行 运行 运行 运行 未开始 WaitSleepJoin 停止

最后三行的输出是直线前进,但为什么所有其他输出运行状态?

谢谢!

回答

1

Bascially这是一个二进制掩码。通过or'ing

ThreadState.Unstarted,ThreadState.WaitSleepJoin,ThreadState.Stopped你构造一个掩码。当你用另一个值掩码and告诉你其他位的其他位是否仍然打开。我们假设我们正在处理四位int Thread.Unstarted == 1,ThreadState.WaitSleepJoing == 2,ThreadState.Stopped == 4,ThreadState.Aborted = 8和ThreadState.Running = 0。 这些并不是真正的价值,只是用它们来简化示例。看看ThreadState的真实值。在二进制

所以:
Thread.Unstarted == 0001
Thread.WaitSleepJoing == 0010
Thread.Stopped == 0100

当你or这些值加在一起你会得到0111

现在当我们and 0111与ThreadState.Aborted(1000)时,您将得到0000是ThreadState.Running。

因此,作者基本上试图向您展示的是ThreadState是一个位向量,您必须构造一个掩码来查看设置了哪些值。

1

它确定ThreadState是否在括号中的三个状态中的任何一个。这只是一个由某人编写的便捷函数,用于确定它是否是他们关心的状态之一,并且清除它们不关注的状态(将所有值都返回运行状态)。

如果用二进制逻辑和数字来考虑它,而不是查看枚举名称,那么很容易找出它在做什么。这是tutorial that might explain it in better detail

1

这是比较明显的,当你检查标志值的ThreadState枚举的每个成员:

[Flags] 
public enum ThreadState 
{ 
    Running = 0, 
    StopRequested = 1, 
    SuspendRequested = 2, 
    Background = 4, 
    Unstarted = 8, 
    Stopped = 16, 
    WaitSleepJoin = 32, 
    Suspended = 64, 
    AbortRequested = 128, 
    Aborted = 256, 
} 

由于您的方法使用(ThreadState.Unstarted | ThreadState.WaitSleepJoin | ThreadState.Stopped)二进制与操作,它会在所有其他情况下返回0,这是值为ThreadState.Running