Это зависит от того, заботитесь ли вы о прошлом или будущем состоянии рассматриваемой недвижимости.
Чтобы попытаться упростить семантику, поймите, что есть несколько сценариев, которые делают дискуссионную форму IsXXX, и некоторые очень распространенные сценарии, где форма IsXXX является единственной полезной.
Ниже приведена таблица истинности для Thread.IsAlive (), основанная на возможных состояниях потока с течением времени. Забудьте о , почему поток может переворачивать состояния флопа, нам нужно сосредоточиться на используемом языке.
Сценарии возможных состояний потока во времени:
Past Present Future
===== ======= =======
1. alive alive alive
2. alive alive dead
3. alive dead dead
4. dead dead dead
5. dead dead alive
6. dead alive alive
7. dead alive dead
8. alive dead alive
Примечание: я говорю о состоянии Future ниже для согласованности. Знание того, умрет ли поток, очень вероятно неизвестно как подмножество Проблема остановки )
Когда мы запрашиваем объект, вызывая метод, существует общее предположение «Жив ли этот поток, в то время, когда я спросил ? Для этих случаев ответ в столбце« Настоящее время »- это все». мы заботимся о том, чтобы форма IsXXX работала нормально.
Сценарии # 1 (всегда живы) и # 4 (всегда мертвы) - самые простые и распространенные. Ответ на IsAlive()
не изменится между вызовами. Битва за язык возникает из-за других 6 случаев, когда результат вызова IsAlive()
зависит от , когда вызывается.
Сценарии # 2 (умрет) и # 3 (умер) переходы из живого в мертвого.
Сценарии # 5 (начнется) и # 6 (начался) перехода от мертвого к живому.
Для этих четырех (2, 3, 5, 6) ответ на IsAlive()
не является постоянным. Возникает вопрос: меня волнует настоящее состояние, IsAlive()
, или меня интересует состояние прошлого / будущего, WasAlive()
и WillBeAlive()
? Если вы не можете предсказать будущее, вызов WillBeAlive()
становится бессмысленным для всех, кроме самых специфических проектов.
При работе с пулом потоков нам может потребоваться перезапустить потоки, находящиеся в «мертвом» состоянии, для обслуживания запросов на подключение, и не имеет значения, были ли они когда-либо живы, просто они в настоящее время мертвы. В этом случае мы можем использовать WasDead()
. Конечно, мы должны попытаться гарантировать, что мы не перезапускаем поток, который был только что перезапущен, но это проблема проектирования, а не семантическая. Предполагая, что никто не может перезапустить поток, не имеет большого значения, используем ли мы IsAlive() == false
или WasDead() == true
.
Теперь о двух последних сценариях. Сценарий # 7 (был мертв, жив, будет мертв) практически такой же, как # 6 . Вы знаете когда в будущем он умрет? Через 10 секунд, 10 минут, 10 часов? Собираетесь ли вы подождать, прежде чем решить, что делать. Нет, вас волнует только текущее (настоящее) состояние. Мы говорим здесь об именах, а не о многопоточности.
Сценарий # 8 (был жив, мертв, будет жив), практически совпадает с # 3 . Если вы повторно используете потоки, то они могут циклически проходить через живые / мертвые состояния несколько раз. Беспокойство о разнице между # 3 и # 8 восходит к проблеме остановки и поэтому может быть проигнорировано.
IsAlive()
должно работать для всех случаев. IsAlive() == false
работает (для # 5 и # 6 ) вместо добавления WasAlive()
.