2

行,

所以我有一个方法,当有人在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 收集?

是匿名方法中对 ShowInfo() 方法的引用吗?

只是感觉有些事情我应该更深入地理解,因为我可以想象使用事件等,用这样的东西很容易造成泄漏。

希望这一切都有意义!

安迪。

4

2 回答 2

10

DispatcherTimer 通过调用内部Dispatcher.AddTimer方法向 Dispatcher 注册自己Start

由于它还会Dispatcher.RemoveTimer在您调用时通过调用注销自身Stop,因此您不会泄漏内存。

使Timer匿名方法在其Tick事件中保持活动状态,这也通过闭包使方法中的变量保持活动状态。

于 2010-06-02T14:07:09.420 回答
1

.NET 中内存泄漏的更模糊原因之一是事件处理程序。事件处理程序是对对象的引用,并将对象保持在范围内。完成事件处理程序后,需要将其删除。如果事件处理程序只使用一次,它可以自行注销,但如果它被多次使用,则需要有其他对象知道它何时不再有用,并删除事件处理程序。

于 2010-06-02T14:12:32.747 回答