是什么让这个计时器在范围内?匿名方法?

And*_*ndy 1 c# events garbage-collection anonymous-methods

好,

所以当有人在Silverlight应用程序中点击我们的Icon时,我会有一个触发方法,如下所示:

    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();
    }
Run Code Online (Sandbox Code Playgroud)

什么意思发生的是ShowInfo()方法打开一个公司信息输入框,调度计时器在所述时间跨度后自动关闭它.这一切都有效......

但是我不确定的是因为调度计时器是本地var,在Logo_MouseLeftButtonUp方法完成之后,在匿名方法被触发之前,有什么能够保持调度计时器被引用并且不能用于GC集合?

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

只是觉得我应该更深入地了解一些事情,因为我可以想象使用事件等,这样就可以很容易地创建漏洞.

希望这一切都有意义!

安迪.

SLa*_*aks 9

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

因为它Dispatcher.RemoveTimer在你打电话时也会通过呼叫取消注册Stop,你不会泄漏内存.

Timer保持在其活着的匿名方法Tick的事件,这也保持了变量的方法通过关闭活着.