当我打开类Cellule.cs时,会创建一个计时器,当Cellule.cs关闭时,计时器仍会调用表单。
如何有效地处理它。这会导致问题,因为Cellules.Cs形式经常打开,并且每次TimeHasChanged()都会对DB进行一次调用;
我已经尝试在Btimer中添加Dispose()方法并将计时器设置为null但它不能解决问题。
private BTimer timer;
public Cellules()
{
timer = new BTimer(30000);
timer.TheTimeChanged += TimeHasChanged;
}
protected void TimeHasChanged()
{
controller.UpdateTimeMesPieces();
lblTime.Text = controller.UpdateTimeClock();
}
继续计时器
public class BTimer
{
private string theTime;
private Timer timer;
public BTimer(int interval)
{
timer = new Timer();
timer.Tick += new EventHandler(Timer_Tick);
timer.Interval = interval;
timer.Start();
}
public delegate void TimerTickHandler();
public event TimerTickHandler TheTimeChanged;
public string TheTime
{
get
{
return theTime;
}
set
{
theTime = value;
OnTheTimeChanged();
}
}
protected void OnTheTimeChanged()
{
if (TheTimeChanged != null)
{
TheTimeChanged();
}
}
private void Timer_Tick(object sender, EventArgs e)
{
TheTime = "Bing";
}
}
答案 0 :(得分:2)
需要实现IDisposable
,并且在Dispose
方法中需要Dispose
计时器,而不是将其设置为“null”。 / p>
您可能也应该将计时器中的任何事件取消关联(尽管如果计时器的Dispose
方法执行此操作,这可能是不必要的):
timer.Tick -= Timer_Tick;
timer.Dispose();
答案 1 :(得分:1)
如果一个类包含一个可以使用的成员,那么该类也应该实现IDisposable
注意:BTimer需要实现IDisposable。
class Cellules : IDisposable
{
BTimer timer // disposable member
public void Dispose() // implementing IDisposable
{
timer.Dispose();
}
}
当然,当你完成后,在任何Cellules实例上调用Dispose
回应您的编辑
你想在BTimer类上实现IDisposable
public class BTimer : IDisposable
{
private string theTime;
private Timer timer;
........
void Dispose()
{
timer.Stop();
timer.Dispose();
}
}
我要添加的是BTimer的Stop方法,因此您不需要处理以停止计时器。
答案 2 :(得分:0)
您的BTimer
尚未实施IDisposable,您必须在不再需要之后取消注册TheTimeChanged
活动。