这个线程状态函数有什么作用

本文关键字:什么 作用 函数 状态 线程 | 更新日期: 2023-09-27 17:55:55

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

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);
}

}

这是运行结果:运行运行运行运行未启动等待睡眠加入停止

输出

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

谢谢!

这个线程状态函数有什么作用

基本上这是一个二进制掩码。通过或一起

ThreadState.Unstarted, ThreadState.WaitSleepJoin,ThreadState.Stop 你构造一个掩码。当您and该掩码时,另一个值会告诉您其他位是否仍处于打开状态。

假设我们正在处理一个四位int Thread.Unstarted == 1,ThreadState.WaitSleepJoing==2,ThreadState.Stop==4,ThreadState.Aborted= 8和ThreadState.Running = 0。这些不是真正的值,只是使用它们来简化示例。查看 ThreadState 以获取实际值。

所以在二进制中:
线程未启动 == 0001
线程等待睡眠乔ing == 0010
线程停止 == 0100

当您将这些值or在一起时,您会得到 0111。

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

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

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

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

当您检查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 的值。