Что держит этот таймер в поле зрения? Анонимный метод? - PullRequest
1 голос
/ 02 июня 2010

Хорошо,

Итак, у меня есть метод, который срабатывает, когда кто-то нажимает на наш значок в приложении Silverlight, как показано ниже:

    private void Logo_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        e.Handled = true;
        ShowInfo(true);

        DispatcherTimer autoCloseTimer = new DispatcherTimer();
        autoCloseTimer.Interval = new TimeSpan(0, 0, 10);
        autoCloseTimer.Tick +=new EventHandler((timerSender,args) => 
            {
                autoCloseTimer.Stop();
                ShowInfo(false);
            });
        autoCloseTimer.Start();
    }

Что должно было произойти, так это то, что метод ShowInfo () открывает окно с информацией о компании, а таймер отправки автоматически закрывает ее после указанного промежутка времени. И это все работает ...

Но в чем я не уверен, так это в том, что таймер диспетчеризации является локальной переменной, после того, как метод Logo_MouseLeftButtonUp завершает работу, что нужно для того, чтобы сохранять таймер диспетчеризации ссылочным и недоступным для сбора GC до запуска анонимного метода? 1008 *

Это ссылка на метод ShowInfo () в анонимном методе?

Просто мне кажется, что кое-что я должен понять глубже, поскольку я могу представить, что с помощью событий и т. Д. Может быть очень легко создать утечку с чем-то вроде этого.

Надеюсь, все это имеет смысл!

Энди.

Ответы [ 2 ]

9 голосов
/ 02 июня 2010

DispatcherTimer регистрируется в Dispatcher, вызывая внутренний метод Dispatcher.AddTimer при вызове Start.

Поскольку он также отменяет регистрацию, вызывая Dispatcher.RemoveTimer при вызове Stop, вы не потеряете память.

Timer поддерживает анонимный метод живым в его событии Tick, которое также поддерживает переменные в методе живыми после закрытия.

1 голос
/ 02 июня 2010

Одной из наиболее неясных причин утечек памяти в .NET являются обработчики событий. Обработчик события является ссылкой на объект и сохраняет объект в области видимости. Когда вы закончите с обработчиком событий, его нужно удалить. Если обработчик событий используется только один раз, он может отменить свою регистрацию, но если он будет использоваться более одного раза, потребуется другой объект, который знает, когда он больше не нужен, и удаляет обработчик событий.

...