清除控件中的计时器后,我应该如何停止它们
本文关键字:我应该 何停止 控件 计时器 清除 | 更新日期: 2023-09-27 18:28:13
我有一个简单的表单,上面有一个splitviewcontainer,左手边是一个菜单,右手边包含一个或多个控件。
可以加载到RHS上的一个控件包含一个计时器,每隔几秒钟刷新一次数据。
如果我在右侧使用Controls.Clear(),控件将不再显示,但我认为它还没有被处理,因为计时器仍在启动(我可以在日志中看到数据库调用)。
因此,我的问题是,当控件从显示中删除时,我应该如何清理它?清除控件时调用哪个事件/方法?
您应该在控件上调用适当的Dispose()
方法。
你可以使用一个扩展方法来做这件事,看看Hans Passant的回答。
可以加载到RHS上的一个控件包含一个计时器,每隔几秒钟刷新一次数据。
现在,你可能有比赛条件。当您调用尚未创建的Clear()
扩展方法时,计时器可能会进行回调。如果您的计时器回调函数可能会导致应用程序中的数据损坏,则必须执行类似操作。
Timer.Stop();
Timer.Tick -= Timer_Tick(TimerCallback);
Timer.Dispose();
现在另一个问题是-你有可能只是隐藏这些控件吗?有没有什么制约因素阻止你这么做?
这段代码应该工作
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
}
}
我很乐意回答任何疑问
我会使用扩展方法而不是Clear()。并循环浏览子控件并专门处理它们。如果有一些certaion控件没有IDispose(但应该有)导致了这种情况,那么您可以在循环中专门捕获它们,并调用任何方法来阻止它们,然后用最终清除来销毁它们。