Когда мой таймер тикает… .NET Memory Leak

У меня есть таймер .NET System.Threading.Timer, который срабатывает каждые 60 секунд и вызывает утечку памяти на каждом такте.

Вкл. каждый такт таймера код выделяет объект IDisposable (называемый SocketsMessageConnector) ... но я удаляю его правильно.

Я побежал. NET Memory Profiler, и каждые 60 секунд я вижу новый экземпляр моего класса SocketsMessageConnector, оставшийся в памяти (так что через 15 минут у меня есть 15 экземпляров). Профилировщик памяти проверяет, что экземпляр действительно удален, но он показывает, что экземпляр основан на TimerCallback, который основан на _TimerCallback, который основан на GCHandle ...

Что здесь происходит? Почему TimerCallback удерживает новый экземпляр, созданный при каждом такте таймера?

PS. Профилировщик заставляет 2 сборщика мусора перед тем, как сделать снимок, поэтому я знаю, что на самом деле это утечка, а не просто оптимизация сборщика мусора.

7
задан Jeff 17 May 2011 в 17:05
поделиться