Каков эффект вызова Thread.CurrentThread.Join(), и если/когда имеет смысл называть его?
Когда имеет смысл Thread.CurrentThread.Join()?
Ответ 1
Каков эффект вызова Thread.CurrentThread.Join()
Вы заблокируете выполнение текущего потока и эффективно заблокируете его. Это приведет к блокировке текущего потока до тех пор, пока текущий поток не завершится, что никогда не произойдет.
и если/когда имеет смысл называть его?
Это не имеет смысла делать это. Вы никогда не должны называть этот метод таким образом.
На стороне примечания, поскольку вы используете .NET 4, я бы рекомендовал избегать использования Thread.Join
в целом. Использование новых классов Task
/Task<T>
гораздо приятнее во многих отношениях, так как вы можете легко присоединить продолжения (или всегда вызывать Task.Wait()
, если вам действительно нужно заблокировать).
Ответ 2
Действительно ли это было
CurrentThread.Join()
который вы видели в реальном коде, - что я сомневаюсь, если только это не ругается, чтобы другие потоки не присоединялись к текущему потоку - или это было
CurrentThread.Join(someTimeout)
Последнее эквивалентно
Thread.Sleep(someTimeout)
за исключением того, что присоединение к текущему потоку позволяет продолжить пересылку сообщений, если вы находитесь в ситуации с графическим интерфейсом/COM.
Ответ 3
Это действительно имеет смысл в мире наблюдаемых. Допустим, у вас есть слушатель очереди в основном, и вы хотите, чтобы основной поток работал навсегда. Вместо того, чтобы делать while (true) и помещать ваш код в цикл, в последней строке вы можете написать это. Таким образом, текущий поток также будет родительским потоком для других потоков, порожденных в приложении. Подумайте об этом как о точке входа для приложения.
Ответ 4
Нет, CurrentThread.Join() не имеет смысла
Это может привести к остановке вашей программы, в результате чего поток A ожидает поток A, например.
Ответ 5
Если вы выполняете unit тест, который проверяет, работают ли таймеры, скажем, в службе Windows, и вы используете операторы Thread.Sleep(), у которых более 60 секунд, вы можете получить ошибки ContextSwitch, потому что Thread.Sleep() блокирует насос сообщений.
Если вы замените эти операторы Thread.Sleep() в своем модульном тесте на Thread.CurrentThread.Join(), то ошибка ContextSwitch исчезнет. Так что это неблокирующее решение.
Вы могли бы сказать, что Thread.CurrentThread.Join() является лучшим Thread.Sleep().