清除后应如何在控件中停止计时器?
我有一个简单的窗体,上面有一个splitviewcontainer,左侧是菜单,右侧包含一个或多个控件。清除后应如何在控件中停止计时器?
一个所述能在RHS被加载对照的含有一个定时器来刷新其数据每隔几秒。
如果我在右侧使用Controls.Clear(),控件不再显示,但我认为它还没有被处置,因为定时器仍然在发射(我可以看到数据库调用是在日志)。
我的问题是这样的,我应该怎么收拾我的控制时,它已经被删除显示?控制清除时调用哪个事件/方法?
你应该叫上控制适当的Dispose()
方法。
您可以使用扩展方法来做到这一点,看到汉斯帕桑特this答案。
可以在RHS上加载的控件之一包含一个定时器,每隔几秒刷新其数据。现在
,你可以在这里有一个竞争条件。当您拨打您尚未创建的Clear()
扩展方法时,计时器可能会因回拨而失败。如果你的定时器回调函数可能会导致应用程序中的数据损坏,你将不得不这样做。
Timer.Stop();
Timer.Tick -= Timer_Tick(TimerCallback);
Timer.Dispose();
现在的另一个问题是 - 您是否可以隐藏这些控件?有没有阻止你这样做的约束?
是不是只是隐藏控件内存泄漏问题? – KingCronus 2012-03-16 15:34:31
@AdamKing:是什么让你得出这个结论? – 2012-03-16 15:37:28
我的理解是,隐藏控制是内存,只是不显示它。这不是这种情况吗? – KingCronus 2012-03-16 15:38:45
这段代码应该工作
public Form1()
{
InitializeComponent();
UserControl cc = new UserControl();
Panel pp = new Panel();
pp.Controls.Add(cc);
pp.ControlRemoved += new ControlEventHandler(pp_ControlRemoved);
pp.Controls.Clear();
}
void pp_ControlRemoved(object sender, ControlEventArgs e)
{
var control = sender as MyVerySpecialControl;
if (control != null)
{
//stop timers or unassign events
}
}
我很乐意回答任何疑问
我会用一个扩展方法,而不是清除()。并通过子控件循环并专门配置它们。如果有证书控制没有导致这种情况的IDispose(但应该有),那么你可以在循环中明确地捕获它们,并在以最终清除摧毁它们之前调用任何方法来阻止它们。
您可以覆盖可见性及起动和停止计时器? – 2012-03-16 15:24:45
或听父母改变? – 2012-03-16 15:25:06
您是否在问如何停止计时器来触发elasped/tick事件或如何处理面板中的控件? – Steve 2012-03-16 15:25:35