0

次のコードは、ThreadState を、Unstarted、Running、WaitSleepJoin、および Stopped の 4 つの最も有用な値のいずれかに取り除きます。

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

出力の最後の 3 行は単純明快ですが、他のすべての出力が Running 状態を出力するのはなぜでしょうか?

ありがとう!

4

3 に答える 3

1

基本的に、これはバイナリ マスクです。一緒に or'ing することによって

ThreadState.Unstarted、ThreadState.WaitSleepJoin、ThreadState.Stopped マスクを作成します。and別の値でマスクすると、他のビットがまだオンになっているかどうかがわかります。

4 ビットの 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 になります。

andThreadState.Aborted (1000)で0111 を実行すると、ThreadState.Running である 0000 が返されます。

したがって、著者がここで基本的に示しようとしているのは、ThreadState はビット ベクトルであり、どの値が設定されているかを確認するにはマスクを作成する必要があるということです。

于 2011-05-09T18:35:17.337 に答える
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)が返されます。0ThreadState.Running

于 2011-05-09T18:32:23.343 に答える
1

ThreadStateが括弧内の 3 つの状態のいずれかにあるかどうかを判断します。これは単に、関心のある状態の 1 つであるかどうかを判断し、関心のない状態を除外するために誰かが作成した便利な関数です (すべての値に対して Running を返します)。

列挙型の名前を見るよりも、数値を使用したバイナリ ロジックの観点から考えた方が、何をしているのかを理解するのは簡単です。これは、より詳細に説明できるチュートリアルです

于 2011-05-09T18:25:56.947 に答える