Каков эффект вызова Thread.CurrentThread.Join(), и если/когда имеет смысл называть его?Когда Thread.CurrentThread.Join() имеет смысл?
ответ
Что такое эффект вызова Thread.CurrentThread.Join()
Вы заблокирует выполнение текущего потока и эффективно мертвую блокировку его. Это приведет к блокировке текущего потока до тех пор, пока текущий поток не завершится, что никогда не произойдет.
, и если/когда имеет смысл называть его?
Это действительно не имеет смысла для этого. Вы никогда не должны называть этот метод таким образом.
На стороне записки, так как вы используете .NET 4, я бы рекомендовал избегать использования Thread.Join
в целом. Использование новых классов Task
/Task<T>
гораздо приятнее во многих отношениях, так как вы можете легко присоединить продолжения (или всегда звоните Task.Wait()
, если вам действительно нужно заблокировать).
Ваше примечание: Вы запутываете C# 5 (.NET 4.5) с C# 4 (.NET 4.0)? –
@JeppeStigNielsen Нет - 'Задача' и' Задача
@JeppeStigNielsen См. Http://msdn.microsoft.com/en-us/library/dd321424(v=vs.100).aspx –
Нет, CurrentThread.Join() не имеет смысла
Это может сделать вашу программу прекращался, делая нить ожидания для резьбы , например.
Было ли это на самом деле
CurrentThread.Join()
, что вы видели в реальном коде - что я как бы сомнения, если это не какой-нибудь хак, чтобы предотвратить другие потоки, чтобы присоединиться в текущем потоке - или это
CurrentThread.Join(someTimeout)
Последнее эквивалентно
Thread.Sleep(someTimeout)
за исключением того, что присоединение на текущий поток позволяет пересылка сообщений для продолжения, если вы находитесь в ситуации с графическим интерфейсом/COM.
Это действительно имеет смысл в мире наблюдаемого. Допустим, у вас есть слушатель очереди в основном, и вы хотите, чтобы основной поток работал навсегда. Вместо того, чтобы делать while (true) и помещать ваш код в цикл, в последней строке вы можете написать это. Таким образом, текущий поток также будет родительским потоком для других потоков, порожденных в приложении. Думайте об этом как о точке входа для приложения.
Вы прочитали документацию? –
Вы видели это где-то в каком-то коде? Очень даже ужасно даже подумать об этом. –
Вы должны вызвать 't.Join()' on _another_ thread 't', а не текущий поток. См. [Документация] (http://msdn.microsoft.com/en-us/library/95hbf2ta.aspx). –