计时器刻度错误的值

Posted

技术标签:

【中文标题】计时器刻度错误的值【英文标题】:Timer ticks with wrong values 【发布时间】:2014-03-10 23:18:48 【问题描述】:

我正在使用 Windows Phone 8 SDK 开发游戏 我需要一个倒计时。

我在第一次 CLICK 时实现了 Dispatcher 计时器 计时器减少,没有错误!

但如果我按下 RESET(它应该重置为 60 SECONDS 并开始倒计时) 它重置为 60 它每秒减少“2 秒”!

如果我再按一次 RESET ,它会每秒减少 3 秒

我用与我的应用程序相同的想法编写的示例代码:(同样的错误 结果)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using PhoneApp3.Resources;
using System.Windows.Threading;

namespace PhoneApp3

    public partial class MainPage : PhoneApplicationPage
    
        private DispatcherTimer time = new DispatcherTimer(); // DISPATCHER TIMER
        private int left;

        // Constructor
        public MainPage()
        
            InitializeComponent();
        

        //Starting Countdown
        private void Start_Click_1(object sender, RoutedEventArgs e)
        
            left = 60; // time left
            time.Interval = TimeSpan.FromSeconds(1);
            time.Tick += time_Tick;
            time.Start();
        

        void time_Tick(object sender, EventArgs e)
        
            left--; // decrease 
            txt.Text = Convert.ToString(left);  // update text           
        

        private void reset_Click(object sender, RoutedEventArgs e)
        
            time.Stop(); 
            Start_Click_1(null, null); // RE - START 
        


    

【问题讨论】:

不要不断添加另一个 Tick 事件处理程序。将 time.Tick 赋值放在构造函数中。 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。 @HansPassant 我不明白,你的意思是只有构造函数中的 Tick 赋值,其余的都可以吗? 【参考方案1】:

每次你按下重置,Start_Click_1 再次运行,你就再次订阅time_Tick

time.Tick += time_Tick;

所以在按了 3 次 Reset 后,你订阅了 3 次,并且每次触发 tick 事件时,下面的代码行运行 3 次:

left--;

将订阅移至您的构造函数:

public MainPage()

    InitializeComponent();

    time.Tick += time_Tick;


//Starting Countdown
private void Start_Click_1(object sender, RoutedEventArgs e)

    left = 60; // time left
    time.Interval = TimeSpan.FromSeconds(1);
    time.Start();

【讨论】:

【参考方案2】:

正如 Hans 在 cmets 中所说,每次单击按钮时您都错误地添加了事件处理程序。

你应该调用这个代码

time.Interval = TimeSpan.FromSeconds(1);
time.Tick += time_Tick;

在构造函数中,而不是在事件处理程序中。

【讨论】:

或者,更准确地说:这会导致执行第一个滴答 1x,第二个滴答 2x,第三个滴答 3x,因为每个滴答都会向事件添加另一个处理程序。

以上是关于计时器刻度错误的值的主要内容,如果未能解决你的问题,请参考以下文章

一个时钟

如何在.Net中正确实现自定义计时器

定时器实现原理——时间轮

定时器实现原理——时间轮

鼠标在c#中单击定时器中的事件

redis示例 - 限速器,计时器