0

以下代码将 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);
}

}

这是运行结果: Running Running Running Running Unstarted WaitSleepJoin Stopped

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

谢谢!

4

3 回答 3

1

它确定 是否ThreadState处于括号中的三种状态中的任何一种。这只是某人编写的一个便利函数,用于确定它是否是他们关心的状态之一,并清除他们不关心的状态(返回 Running 以获得所有值)。

如果您根据带数字的二进制逻辑来考虑它,而不是查看枚举名称,则更容易弄清楚它在做什么。这是一个教程,可能会更详细地解释它

于 2011-05-09T18:25:56.947 回答
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,
}

由于您的方法使用与 的二进制 AND 运算(ThreadState.Unstarted | ThreadState.WaitSleepJoin | ThreadState.Stopped),因此在所有其他情况下它将返回0,即 的值ThreadState.Running

于 2011-05-09T18:32:23.343 回答
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。

现在,当我们and使用 ThreadState.Aborted (1000) 0111 时,您会得到 0000,即 ThreadState.Running。

所以作者在这里基本上试图向您展示的是 ThreadState 是一个位向量,您必须构造一个掩码才能查看设置了哪些值。

于 2011-05-09T18:35:17.337 回答