(Это, пожалуй, немного низкоуровневое, но, по крайней мере, это простое решение. Поскольку я не знаю, C# 's API, это общее решение для любого языка с использованием нитей-пулов.)
Вставьте задачу watchdog после каждой реальной задачи, которая обновляет значение времени с текущим временем. Если это значение больше, чем максимальное время выполнения задачи (скажем, 10 секунд), вы знаете, что что-то застряло.
Вместо того, чтобы устанавливать время и опросить его, вы можете непрерывно устанавливать и перезагружать некоторые таймеры на 10 секунд в будущее. Когда он срабатывает, задача зависла.
Лучший способ, вероятно, состоит в том, чтобы обернуть каждую задачу в класс задач «Сторожевой», который делает это автоматически. Таким образом, после завершения, вы очистите таймер, и вы также можете установить тайм-аут на одну задачу, что может быть полезно.
Для каждого потока в потоковом потоке вам нужен один объект времени/таймера, но это разрешимо через локальные переменные потока.
Обратите внимание, что это решение не требует изменения кода вашей задачи. Он только изменяет задачи ввода кода в пул.
Что вы планируете делать, когда знаете, что нить заморожена? Убей это? Это может привести к тому, что структуры данных будут использоваться потоком в несогласованном состоянии. Вам лучше найти источник тупика и зафиксировать его. – cdhowie
Да, мне нужно убить его. Его «огонь и забыть» тип нити, поэтому я думаю, что нет никакого вреда, если его убили. –
«Я думаю, что нет никакого вреда, если его убили» - Знаменитые последние слова ... –