这个线程状态函数做了什么?

时间:2011-05-09 18:14:14

标签: c# multithreading thread-state

以下代码将ThreadState剥离为四个最有用的值之一:Unstarted,Running,WaitSleepJoin和Stopped:

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 停止

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

谢谢!

3 个答案:

答案 0 :(得分:1)

确定ThreadState是否在括号中的三种状态中的任何一种状态。这只是一个由某人编写的便利函数,用于确定它是否是他们关心的状态之一,并清除他们不关注的状态(返回Running for all over values)。

如果你用数字的二进制逻辑来思考它,而不是查看枚举名称,就更容易弄清楚它在做什么。这是一个tutorial that might explain it in better detail

答案 1 :(得分: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)的二进制AND操作,因此在所有其他情况下都会返回0,这是ThreadState.Running的值。

答案 2 :(得分:1)

基本上这是一个二元掩码。通过或在一起

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.

现在当我们使用ThreadState.Aborted(1000)and 0111时,你得到的是0000,这是ThreadState.Running。

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

相关问题