DispatcherTimer在I';我阻止了它
本文关键字:DispatcherTimer | 更新日期: 2023-09-27 18:05:07
下面的代码有问题。我有一些代码调用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
尝试使用sender对象而不是实际的公共计时器对象来停止计时器:
private void TimerCallback(object sender, object e) {
(sender as DispatcherTimer).Stop();
// Other code
}
作为一种变通方法,您可以执行以下操作:
// in your class
private bool _allowExecution = false;
然后,每当您启动时间设置_allowExecution = true;
和停止计时器时,只需添加_allowExecution = false;
最后一件事是在计时器执行中添加一个简单的布尔条件:if (_allowExecute) //do your stuff here
因为每次调用SetTimer(int interval)
时都会初始化一个新的DispatcherTimer
。在初始化新实例之前,必须停止旧的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;
}
}