Возможно, я делаю что-то глупое, в таком случае прошу прощения. Я работаю с классом System.Threading.Timer и устанавливаю таймеры включения-выключения, используя объект state
для передачи управляющей информации. Все работает, как я и ожидал, за исключением того, что объект состояния не завершается до выхода из программы. Этот пример показывает, что я имею в виду.
class State
: IDisposable
{
public State()
{
Console.Out.WriteLine("State.State()");
}
~State()
{
Console.Out.WriteLine("State.~State()");
}
void IDisposable.Dispose()
{
Console.Out.WriteLine("State.Dispose()");
}
}
class Program
{
public static void Callback(object obj)
{
Console.Out.WriteLine("entering Callback()");
State state = (State)obj;
// . . . // do stuff
Console.Out.WriteLine("leaving Callback()");
}
public static void Main(string[] args)
{
Timer t = new Timer(Callback, new State(), 1000, Timeout.Infinite);
Thread.Sleep(5000);
t.Dispose();
t = null;
GC.Collect(10, GCCollectionMode.Forced); // prod GC to release "State"
Console.Out.WriteLine("leaving Main()");
}
}
Выход из этого:
State.State()
entering Callback()
leaving Callback()
leaving Main()
State.~State()
Поскольку я устанавливаю время Timeout.Infinite
для получения одноразового таймера, не должен ли пул потоков освобождать свои ссылки на объект состояния после отправки таймера, а не ждать до конца программы, как показано . Я обеспокоен тем, что это будет тонкой утечкой памяти.
Пожалуйста, просветите меня. :-)