Как правильно ждать запуска потока.NET?

Я читал следующее на веб-сайте Microsoft в рамках их учебника по потокам:

http://msdn.microsoft.com/en-us/library/aa645740%28v=vs.71%29.aspx

MSDN предлагает использовать следующее, чтобы дождаться оживления потока:

while (!oThread.IsAlive);

Это рекомендуемый способ ожидания? Было бы лучше вставить вызов "DoEvents", чтобы основной поток оставался отзывчивым? Как следует обрабатывать ошибки, если что-то идет не так, и поток никогда не "оживает"? Если это плохая практика, когда лучше всего использовать IsAlive?

Несколько модераторов отметили это как дубликат, но в другом вопросе, на который они ссылаются, ничего не говорится о IsAlive, DoEvents или правильной обработке ошибок, если поток не запускается. Мой вопрос конкретно связан со статьей MSDN, на которую я ссылался в моем вопросе, и с предложением использовать занятый цикл с IsAlive.

2 ответа

Решение

Поскольку пока нет официального ответа... То, что вы видели на MSDN, относится к 2003 году, это относительно старая технология. Для того, что вы хотите сделать, я бы использовал Task Parallel Library (TPL). Для этого требуется.NET Framwork 4.0+.

Для хорошего учебника о том, как использовать TPL для того, что вам нужно, смотрите:

  1. Задача Параллель 1 из п.

  2. Потоки Дж. Албахари в C#.

Как только вы освоитесь с TPL, не стесняйтесь возвращаться и искать конкретные вопросы.

Надеюсь, это поможет.

В дополнение к ответу Killercam я хочу отметить, что пример кода на связанной странице является мусором. Похоже, кому-то сказали "создайте образец, который просто показывает все различные методы, которые мы имеем на одной странице". И это буквально так вышло...

При выполнении потоков вы почти никогда не ждете в цикле опроса. Особенно в тесном с любым ожиданием. Они нагревают процессор, ненадежны, имеют большую задержку, если вы усыпляете и есть просто лучшие способы сделать это. Спин-петли предназначены для экспертов, которые знают, что они делают в очень специфических случаях.

Нет смысла ждать, пока Нить станет "живой". Зачем кому-то делать это в реальном коде? Это даже не означает, что ваш процесс потока начал выполняться (на самом деле! Это не так.).

Я рекомендую вам использовать современные парадигмы. TPL - хорошее место для начала. Смотрите ответ Killercam.

Другие вопросы по тегам