Вы не утилизируете таймер после использования.Вот что задерживает его коллекцию.
Если ваш класс содержит объекты, которые реализуют IDisposable
(как это делает Timer
), он также должен реализовать IDisposable
.
public class TestTimer : IDisposable
{
private Timer timer;
public TestTimer()
{
timer = new Timer(1000);
...
}
#region IDisposable
public void Dispose()
{
Dispose(true);
}
volatile bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (disposing && !disposed)
{
timer.Dispose();
GC.SupressFinalize(this);
disposed = true;
}
}
~TestTimer() { Dispose(false); }
#endregion
}
Ваш основной метод должен выглядеть следующим образом:
public static void Main()
{
using (TestTimer timer = new TestTimer())
{
// do something
}
GC.Collect();
GC.WaitForPendingFinalizers();
Console.ReadKey();
}
Опять же, если ваш TestTimer
должен жить дольше, чем область действия одного Main
метода, тогда класскоторый создает его и держит ссылку, должен также реализовать IDisposable
.