【问题标题】:what does this thread state function do?这个线程状态函数是做什么的?
【发布时间】:2011-05-09 18:14:13
【问题描述】:

以下代码将 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状态呢?

谢谢!

【问题讨论】:

    标签: c# multithreading thread-state


    【解决方案1】:

    基本上这是一个二进制掩码。通过or'ing在一起

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

    假设我们正在处理一个四位整数 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 是一个位向量,您必须构造一个掩码才能查看设置了哪些值。

    【讨论】:

      【解决方案2】:

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

      如果您根据带数字的二进制逻辑来考虑它,而不是查看枚举名称,则更容易弄清楚它在做什么。这是tutorial that might explain it in better detail

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-03
          • 2017-01-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多