1) Как я могу определить источник этих 27 таймеров?
Попробуйте найти экземпляры TimerCallback
(для Threading.Timer):
!dumpheap -type TimerCallback
Затем выведите свойства обратного вызова (где адрес обратного вызова - это «Адрес» из вывода dumpheap):
!do <callback address>
Затем выведите адрес Value
свойства _target
:
!do <_target address>
Это должно выплюнуть объект, который содержит ссылку на TimerCallback, который должен привести вас туда, где был создан таймер.
Я рекомендую проверить Лаборатории отладки Тесс Феррандез , если вы еще этого не сделали.
2) Что означает 13 мертвых тем?
Насколько я понимаю, мертвый поток ссылается на поток C ++, который больше не имеет активного потока ОС, но все еще имеет ссылки и поэтому не может быть уничтожен (потоки C ++ используют подсчет ссылок).
Поток C # содержит ссылку на поток C ++, и если ваш управляемый код содержит ссылку на поток C #, то это может стать вашей проблемой.
Этот пост в блоге Юнь Джина может быть интересен для вас.
3) Одна из моих тем помечена как имеющая блокировку. Если я переключаюсь на этот поток и запускаю! Clrstack, я вижу следующее - связано ли это с моими таймерами?
Это похоже на поток таймера (System.Threading), ожидающий истечения своего интервала.