清除后应如何在控件中停止计时器?

问题描述:

我有一个简单的窗体,上面有一个splitviewcontainer,左侧是菜单,右侧包含一个或多个控件。清除后应如何在控件中停止计时器?

一个所述能在RHS被加载对照的含有一个定时器来刷新其数据每隔几秒。

如果我在右侧使用Controls.Clear(),控件不再显示,但我认为它还没有被处置,因为定时器仍然在发射(我可以看到数据库调用是在日志)。

我的问题是这样的,我应该怎么收拾我的控制时,它已经被删除显示?控制清除时调用哪个事件/方法?

+0

您可以覆盖可见性及起动和停止计时器? – 2012-03-16 15:24:45

+0

或听父母改变? – 2012-03-16 15:25:06

+0

您是否在问如何停止计时器来触发elasped/tick事件或如何处理面板中的控件? – Steve 2012-03-16 15:25:35

你应该叫上控制适当的Dispose()方法。

您可以使用扩展方法来做到这一点,看到汉斯帕桑特this答案。

可以在RHS上加载的控件之一包含一个定时器,每隔几秒刷新其数据。现在

,你可以在这里有一个竞争条件。当您拨打您尚未创建的Clear()扩展方法时,计时器可能会因回拨而失败。如果你的定时器回调函数可能会导致应用程序中的数据损坏,你将不得不这样做。

Timer.Stop(); 
Timer.Tick -= Timer_Tick(TimerCallback); 
Timer.Dispose(); 

现在的另一个问题是 - 您是否可以隐藏这些控件?有没有阻止你这样做的约束?

+0

是不是只是隐藏控件内存泄漏问题? – KingCronus 2012-03-16 15:34:31

+0

@AdamKing:是什么让你得出这个结论? – 2012-03-16 15:37:28

+0

我的理解是,隐藏控制是内存,只是不显示它。这不是这种情况吗? – 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(但应该有),那么你可以在循环中明确地捕获它们,并在以最终清除摧毁它们之前调用任何方法来阻止它们。