2013-06-12 3 views
8

Каков эффект вызова Thread.CurrentThread.Join(), и если/когда имеет смысл называть его?Когда Thread.CurrentThread.Join() имеет смысл?

+0

Вы прочитали документацию? –

+0

Вы видели это где-то в каком-то коде? Очень даже ужасно даже подумать об этом. –

+0

Вы должны вызвать 't.Join()' on _another_ thread 't', а не текущий поток. См. [Документация] (http://msdn.microsoft.com/en-us/library/95hbf2ta.aspx). –

ответ

12

Что такое эффект вызова Thread.CurrentThread.Join()

Вы заблокирует выполнение текущего потока и эффективно мертвую блокировку его. Это приведет к блокировке текущего потока до тех пор, пока текущий поток не завершится, что никогда не произойдет.

, и если/когда имеет смысл называть его?

Это действительно не имеет смысла для этого. Вы никогда не должны называть этот метод таким образом.


На стороне записки, так как вы используете .NET 4, я бы рекомендовал избегать использования Thread.Join в целом. Использование новых классов Task/Task<T> гораздо приятнее во многих отношениях, так как вы можете легко присоединить продолжения (или всегда звоните Task.Wait(), если вам действительно нужно заблокировать).

+0

Ваше примечание: Вы запутываете C# 5 (.NET 4.5) с C# 4 (.NET 4.0)? –

+3

@JeppeStigNielsen Нет - 'Задача' и' Задача 'являются .NET 4.' await'/'async' являются C# 5, но' Task' их предшествовал. –

+0

@JeppeStigNielsen См. Http://msdn.microsoft.com/en-us/library/dd321424(v=vs.100).aspx –

1

Нет, CurrentThread.Join() не имеет смысла
Это может сделать вашу программу прекращался, делая нить ожидания для резьбы , например.

10

Было ли это на самом деле

CurrentThread.Join() 

, что вы видели в реальном коде - что я как бы сомнения, если это не какой-нибудь хак, чтобы предотвратить другие потоки, чтобы присоединиться в текущем потоке - или это

CurrentThread.Join(someTimeout) 

Последнее эквивалентно

Thread.Sleep(someTimeout) 

за исключением того, что присоединение на текущий поток позволяет пересылка сообщений для продолжения, если вы находитесь в ситуации с графическим интерфейсом/COM.

1

Это действительно имеет смысл в мире наблюдаемого. Допустим, у вас есть слушатель очереди в основном, и вы хотите, чтобы основной поток работал навсегда. Вместо того, чтобы делать while (true) и помещать ваш код в цикл, в последней строке вы можете написать это. Таким образом, текущий поток также будет родительским потоком для других потоков, порожденных в приложении. Думайте об этом как о точке входа для приложения.