Когда имеет смысл 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().