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

DispatcherTimer在I';我阻止了它

尝试使用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;
    }
}