DispatcherTimer在我停止后继续射击。 C#UWP

时间:2016-08-31 20:57:11

标签: c# uwp

我遇到以下代码时遇到问题。我有一些调用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

3 个答案:

答案 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;
    }
}