这个线程状态函数有什么作用
本文关键字:什么 作用 函数 状态 线程 | 更新日期: 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
的值。