System.Windows.Forms.Timer и GC
От: BluntBlind  
Дата: 17.04.07 16:16
Оценка: 24 (1)
#Имя: FAQ.dotnet.timerandgc
Здравствуйте, _Morpheus_, Вы писали:

А>В приложении Windows Forms создаю таймер,запускаю и привязываю событие.

А>Далее этой же переменной присваиваю другой таймер,т.е. доступ к первому таймеру потерян.
А>При наступлении события запускаю сборщик мусора. По идее первый таймер должен быть уничтожен, но он работает. Пробовал и в Release и в Debug. У Рихтера похожий пример, все работает правильно.
А>Почему таймер не уничтожается,а если таких операций будет 1000? Это разве не утечка ресурсов? Я что то не понимаю.

_M_>Т.е. перед тем как менять значение переменной timer, нужно сделать следующее:

_M_>
_M_>timer.Enabled = false;

_M_>timer = new Timer();
_M_>


Пошарился Reflectorom
Если Enable = true;
То вызывается
 if (value)
                    {
                        if (this.timerWindow == null)
                        {
                            this.timerWindow = new TimerNativeWindow(this);
                        }
                        this.timerRoot = GCHandle.Alloc(this);
                        this.timerWindow.StartTimer(this.interval);
                    }

В MSDN про GCHandle.Alloc(this) есть такие слова:

Return Value
A new GCHandle that protects the object from garbage collection. This GCHandle must be released with Free when it is no longer needed.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.