У меня есть таймер .NET System.Threading.Timer, который срабатывает каждые 60 секунд и вызывает утечку памяти на каждом такте.
Вкл. каждый такт таймера код выделяет объект IDisposable (называемый SocketsMessageConnector) ... но я удаляю его правильно.
Я побежал. NET Memory Profiler, и каждые 60 секунд я вижу новый экземпляр моего класса SocketsMessageConnector, оставшийся в памяти (так что через 15 минут у меня есть 15 экземпляров). Профилировщик памяти проверяет, что экземпляр действительно удален, но он показывает, что экземпляр основан на TimerCallback, который основан на _TimerCallback, который основан на GCHandle ...
Что здесь происходит? Почему TimerCallback удерживает новый экземпляр, созданный при каждом такте таймера?
PS. Профилировщик заставляет 2 сборщика мусора перед тем, как сделать снимок, поэтому я знаю, что на самом деле это утечка, а не просто оптимизация сборщика мусора.