以下代码将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 停止
最后三行输出是直接的,但为什么所有其他输出都是运行状态?
谢谢!
答案 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是一个位向量,您必须构造一个掩码来查看设置了哪些值。