что делает эта функция состояния потока? - PullRequest
0 голосов
/ 09 мая 2011

Следующий код переводит 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);
}

}

И вот результат бега: Бег Бег Бег Бег Unstarted WaitSleepJoin Stopped

Последние три строки вывода являются прямымивперед, но почему все остальные выводит состояние бега?

Спасибо!

Ответы [ 3 ]

1 голос
/ 09 мая 2011

Это становится более очевидным, когда вы проверяете значения флагов для каждого члена перечисления 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.

1 голос
/ 09 мая 2011

В основном это бинарная маска.Объединяя

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.

Теперь, когда мы and 0111 с ThreadState.Aborted (1000), вы получите 0000, который является ThreadState.Running.

Итак, автор в основном пытается показать вам, что ThreadState является битовым вектором, и вам нужно создать маску, чтобы увидеть, какие значения установлены.

1 голос
/ 09 мая 2011

Определяет, находится ли ThreadState в любом из трех состояний в скобках. Это просто вспомогательная функция, написанная кем-то, чтобы определить, является ли это одним из состояний, которое им небезразлично, и отсеять состояния, в которых они не заинтересованы (возвращая значения Running for all over).

Проще понять, что он делает, если думать об этом с точки зрения двоичной логики с числами, а не смотреть на имена перечислений. Вот учебник , который может объяснить его более подробно .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...