У меня есть приложение, которое запускает 10 потоков. Каждый поток выполняет свою работу и ждет (используя модель производителя-потребителя). Поэтому, когда появляется дополнительная работа, один из потоков разблокируется, и он выполняет свою работу.

Коллега по работе настаивает, чтобы я написал код, который отслеживает потоки «на всякий случай», когда они зависают / не отвечают или умирают.

Пока что в моем тестировании они работают нормально и корректно закрываются.

У меня вопрос: «Должен ли я вставлять для этого код»? Если да, то «как мне отслеживать поток и проверять его статус»?

Спасибо. JD

c#
4
JD. 29 Июл 2009 в 00:17

7 ответов

Лучший ответ

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

Очевидно, что если вы сделали такой выбор, вы должны быть осторожны, чтобы не испортить вещи и не внести некоторые ошибки, которые на самом деле сами заставят плохое случиться.

5
mmx 28 Июл 2009 в 20:20

В идеале нет, ваши потоки должны заканчиваться правильно. Мониторинг их не стоит сложности и времени на обработку. Если вы все сделаете правильно, вам не понадобится мониторинг.

4
Otávio Décio 28 Июл 2009 в 20:20

Предполагая, что вы кодируете платформу .NET 2 или более поздней версии, необработанное исключение в рабочем потоке уничтожит все приложение.

Если вы не уверены, что ваш код потока не вызовет исключение (или не зарезервирует память, или захватит дескриптор, или вызовет код фреймворка, который вы не писали ...), первое, что вы захотите написать в своем потоке. метод входа - это попытка / уловка.

2
wildcard 28 Июл 2009 в 20:35

Если ваши потоки проводят много времени в ожидании своей работы, вы можете подумать о рефакторинге приложения для использования класса System.Threading.ThreadPool. Это переложит большую часть вашего управления потоками на фреймворк.

2
Tinister 28 Июл 2009 в 20:39

Потоки не просто зависают и не умирают, если в пользовательском коде нет ошибки. Вероятность того, что OS / Framework испортится, настолько мала, что практически невозможна. Это похоже на беспокойство о том, что жесткий диск не записывает файл, даже если File.WriteAllBytes () завершается успешно. Этого просто не бывает.

При этом подстановочный знак Поднимает хороший момент, что необработанное исключение в рабочем потоке всплывает как необработанное исключение во всем домене приложения.

1
Community 23 Май 2017 в 12:26

Лучший способ сделать это - использовать ThreadPool и вызвать ThreadPool.QueueUserWorkItem, и .Net очень эффективно управляет ThreadPool.

Вы можете установить максимальное количество потоков для выделения, и вам не нужно выполнять какие-либо операции ожидания и т. Д. Вы также можете заставить WaitHandle ждать по завершении. И вам не нужно управлять блокировкой / разблокировкой потоков.

0
Akash Kava 28 Июл 2009 в 21:04

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

-1
Frozenskys 28 Июл 2009 в 20:20