我遇到以下代码时遇到问题。我有一些调用SetTimer()
的代码,并希望用户在达到interval
之前做出响应(在
的毫秒)。调用代码继承了这些功能。如果用户响应,则调用StopTimer()
,显示信息,调用StartTimer()
,并且期望用户在interval
时间段内再次响应。这将一直持续到用户未通过答案或花费太长时间(超过interval
)。
问题是计时器不停止。在我停止后,它们会不断重复,将Tick
事件设置为null
(通过-=
方法),并将其范围保留。我甚至用一个新的DispatcherTimer
来获得新的存储空间(我已经使用旧的存储器和每次新的存储器完成了这个)。我无法让旧的Timer
消失。
我做错了什么?
using Windows.UI.XAML;
public DispatcherTimer GameTimer;
internal void SetTimer(int interval)
{
GameTimer = new DispatcherTimer();
GameTimer.Tick += TimerCallback;
GameTimer.Interval = new TimeSpan(0,0,0,0,interval);
GameTimer.Start();
}
internal void StopTimer()
{
GameTimer.Stop();
try
{
GameTimer.Tick -= TimerCallback;
} catch {}
}
private void TimerCallback(object sender, object e)
{
StopTimer();
// Other code
}
提前致谢,
-justin
答案 0 :(得分:0)
尝试使用sender对象而不是实际的公共计时器对象来停止计时器:
private void TimerCallback(object sender, object e) {
(sender as DispatcherTimer).Stop();
// Other code
}
答案 1 :(得分:0)
作为一种解决方法,您可以执行以下操作:
// in your class
private bool _allowExecution = false;
然后,无论何时开始设置_allowExecution = true;
的时间,当您停止计时器时,只需添加_allowExecution = false;
最后一件事是在你的计时器执行:if (_allowExecute) //do your stuff here
答案 2 :(得分:0)
因为您每次调用DispatcherTimer
初始化一个新的SetTimer(int interval)
。您必须在初始化新实例之前停止旧DispatcherTimer
实例。
internal void SetTimer(int interval)
{
StopTimer();
GameTimer = new DispatcherTimer();
GameTimer.Tick += TimerCallback;
GameTimer.Interval = new TimeSpan(0,0,0,0,interval);
GameTimer.Start();
}
internal void StopTimer()
{
if(GameTimer != null)
{
GameTimer.Stop();
GameTimer.Tick -= TimerCallback;
GameTimer = null;
}
}