Почему Thread.Join так долго возвращается? - PullRequest
0 голосов
/ 08 октября 2009

Я вызываю Thread.Join в потоке ThreadPool в конце службы. Код, выполняемый в потоке, заканчивается примерно в то же время, когда вызывается Thread.Join, но для возврата Join требуется 2 минуты. Почему Thread.Join возвращается 2 минуты.

Журнал:

(2009-10-08 14:22:09) Inf: ProcessRequests - Interrupted, exiting.
(2009-10-08 14:22:09) Dbg: ProcessingDriver.Stop - Waiting on thread to exit.
(2009-10-08 14:24:10) Dbg: ProcessingDriver.Stop - Thread joined.

Код:

WaitHandle.Set(); //Signal it's time to go home
LogManager.Logger.WriteLog(LOG_SOURCE, "Waiting on thread to exit.", LogType.Debug, 7);
ProcessingThread.Join(); //Wait for the thread to go home
LogManager.Logger.WriteLog(LOG_SOURCE, "Thread joined.", LogType.Debug, 7);

Ответы [ 3 ]

14 голосов
/ 08 октября 2009

Вы не должны вызывать Thread.Join в потоке ThreadPool.

Когда вы вызываете Thread.Join, он поддерживает ваш основной поток живым. Пул потоков (не обязательно) не закрывает свои потоки, пока ваша программа не завершится. В вашем случае вам повезло, и он решил закрыть этот поток через пару минут простоя - но это не гарантировано. Если вы захватите не ту нить пула потоков, она может зависнуть навсегда.

Если вам нужно дождаться выполнения задачи, которую вы настроили, вместо этого используйте ManualResetEvent для отслеживания ее завершения.

5 голосов
/ 08 октября 2009

Почему вы присоединяетесь к теме ThreadPool? Поток не принадлежит вам и может использоваться средой выполнения для других операций. Вы должны присоединиться только к своим темам.

1 голос
/ 08 октября 2009

Не уверен, но идея потоков в пуле потоков состоит в том, что они не удаляются, а используются повторно. Присоединение к потоку прекратит блокировку, когда поток завершится ..

...