Является ли объект с прикрепленным событием и не имеет ссылок на него пригодным для сбора мусора? - PullRequest
0 голосов
/ 14 июня 2011

Цитата из спецификации языка C # 3.9:

'2.Если объект или любая его часть не могут быть доступны с помощью какого-либо возможного продолжения выполнения, кроме запуска деструкторов, объект считается больше не используемым, и он становится пригодным для уничтожения ...

Например, будет ли DispatcherTimer иметь право на сборку мусора до того, как сработает событие Tick?

    public void DispatchCallbackAfter(Action callback, TimeSpan period)
    {
        DispatcherTimer timer = new DispatcherTimer(DispatcherPriority.Normal, AppSettings.MainWindow.Dispatcher);
        timer.Tick += new EventHandler(DispatchCallback);
        timer.Interval = period;
        timer.Tag = new object[] {timer, callback};
        timer.Start();
    }

    private void DispatchCallback(object sender, EventArgs args)
    {
        DispatcherTimer t = (DispatcherTimer)sender;
        t.Stop();
        ((Action)((object[])t.Tag)[1])();
    }

ПРИМЕЧАНИЕ. В timer.Tag есть собственная ссылка на таймер, но я полагаю, что это не будетразница?

1 Ответ

1 голос
/ 14 июня 2011

Пока работает DispatcherTimer, Dispatcher имеет ссылку на него, и он не получит GCed.Как только таймер останавливается и , на него нет внешней ссылки, его можно собрать.То есть, если ваши единственные ссылки на таймер и обратный вызов - это в пределах таймера и обратного вызова, и таймер остановлен, таймер может быть собран.

Вы можете сказать, чтоДиспетчер получает ссылку на работающий таймер, просматривая Reflector (или ваш любимый декомпилятор) и видя, что таймер вызывает _dispatcher.AddTimer(this); в своей функции запуска и _dispatcher.RemoveTimer(this); в своей функции остановки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...