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()方法的引用吗?
只是觉得我应该更深入地了解一些事情,因为我可以想象使用事件等,这样就可以很容易地创建漏洞.
希望这一切都有意义!
安迪.
DispatcherTimer通过在调用Dispatcher.AddTimer时调用内部方法向Dispatcher注册自己Start.
因为它Dispatcher.RemoveTimer在你打电话时也会通过呼叫取消注册Stop,你不会泄漏内存.
将Timer保持在其活着的匿名方法Tick的事件,这也保持了变量的方法通过关闭活着.