timer-C# Winform Timer倒计时问题

问题描述

C# Winform Timer倒计时问题

使用Timer控件做一个倒计时器
可以根据输入的值来控制倒计时的事件。

假设输入的是180s
第一次点开始按钮是 180 179 178 ......正常的
点了重置按钮之后,第二次点开始按钮就是 180 178 176.....
再次重置并且点击开始按钮之后,变成 180 177 174...
...
这些间隔都是1s

这是什么情况?如何解决?

以下为简化版的代码:

private void buttonSetTimeStart_Click(object sender, EventArgs e)
{
    this.Clock = 180;
    this.timerSetTime.Enabled = true;
    this.timerSetTime.Tick += new EventHandler(timerSetTime_Tick);
    this.timerSetTime.Start();
}

void timerSetTime_Tick(object sender, EventArgs e)
{
    Clock--;
    this.labelSetTimeMinute.Text = Clock.ToString();
    if (Clock == 0)
    {
        this.timerSetTime.Stop();
    }
}

private void buttonSetTimeReset_Click(object sender, EventArgs e)
{
    this.timerSetTime.Enabled = false;
    this.timerSetTime.Stop();
    this.timerSetTime.Interval = 1000;
    this.labelSetTimeMinute.Text = "";
}

解决方案

问题在这里
this.timerSetTime.Tick += new EventHandler(timerSetTime_Tick);
你每次都挂接了一个新的事件处理程序
导致它被重复执行了2次、3次。
解决方法就是将这一行写在FormLoad中。

时间: 2024-11-03 22:39:01

timer-C# Winform Timer倒计时问题的相关文章

Storm-源码分析- timer (backtype.storm.timer)

mk-timer timer是基于PriorityQueue实现的(和PriorityBlockingQueue区别, 在于没有阻塞机制, 不是线程安全的), 优先级队列是堆数据结构的典型应用  默认情况下, 按照自然顺序(其实就是默认comparator的定义), 最小的元素排在堆头  当然也可以自己重新实现comparator接口, 比如timer就用reify重新实现了comparator接口 整个过程其实比较简单, 开个timer-thread, 不断check PriorityQueu

C#winform timer事件中循环取数据的问题

问题描述 timer事件中.利用for循环,通过访问存储过程取数据,存储过程大概如下:begindeclare@fidintselecttop1fid=@fidfromtablewhereflag=1updatetablesetflag=2wherefid=@fid......还有一些update执行语句select*fromtablewherefid=@fidend目前存在的问题是,有时候出现两次循环取的是同一条数据的问题,正常来讲flag已经被update成2了,就不应该检索出相同fid的数

关于Winform的Timer控件问题

问题描述 请问Timer控件是多线程的吗??比如我设置Timer每10秒执行一个事件,如果单个事件10秒内执行不完,那10秒后,程序还会在进入吗??? 解决方案 解决方案二:Timer在winform下有3个,其中就有一个线程Timer至于10秒后,程序还会不会进入就要你自己的逻辑判断了,可以选择进入,也可以阻塞不进入解决方案三:引用1楼的回复: Timer在winform下有3个,其中就有一个线程Timer至于10秒后,程序还会不会进入就要你自己的逻辑判断了,可以选择进入,也可以阻塞不进入 3

WML教程13:计时器(timer)

教程 timer可以用来在用户不进行任何操作的一段时间后,自动执行一个任务,任何激活CARD页面的任务和用户操作都会启动timer,而任务进行时,timer就停止.每个CARD只能有一个timer,一个timer只能触发一个任务.语法如下:<timer value="value"/>,value为必选属性,用来设置定时器的定时值,最小单位为0.1秒. 相关属性: value 倒计时的点数,每一单位等于0.1秒. 示例: <?xml version="1.0&

关于C#中timer类 在C#里关于定时器类就有3个

定时 ·关于C#中timer类  在C#里关于定时器类就有3个   1.定义在System.Windows.Forms里   2.定义在System.Threading.Timer类里   3.定义在System.Timers.Timer类里  System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使用API  SetTimer实现的.它的主要缺点是计时不精确,而且必须有消息循环,Co

让窗体飘动起来--C#中Timer组件用法

Timer组件是也是一个WinForm组件了,和其他的WinForm组件的最大区别是:Timer组件是不可见的,而其他大部分的组件都是都是可见的,可以设计的.Timer组件也被封装在名称空间System.Windows.Forms中,其主要作用是当Timer组件启动后,每隔一个固定时间段,触发相同的事件.Timer组件在程序设计中是一个比较常用的组件,虽然属性.事件都很少,但在有些地方使用它会产生意想不到的效果. 本文介绍的程序,是用Visual C#做的一个窗体飘动的程序,这其中就大量的使用了

C#中Timer定时器的使用示例

关于C#中timer类 在C#里关于定时器类就有3个: 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类里 3.定义在System.Timers.Timer类里 System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使用API SetTimer实现的.它的主要缺点是计时不精确,而且必须有消息循环,Console Applic

C#中自定义高精度Timer定时器的实例教程_C#教程

1.背景 在C#里关于定时器的类就有3个: (1)定义在System.Windows.Forms里   (2)定义在System.Threading.Timer类里   (3)定义在System.Timers.Timer类里 Timer 用于以用户定义的事件间隔触发事件.Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理.它要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程. 使用此计时器时,请使用控件的Tick事件执行轮询操作,

详解C#中的定时器Timer类及其垃圾回收机制_C#教程

关于C# Timer类  在C#里关于定时器类就有3个 C# Timer使用的方法1.定义在System.Windows.Forms里 C# Timer使用的方法2.定义在System.Threading.Timer类里  " C# Timer使用的方法3.定义在System.Timers.Timer类里 下面我们来具体看看这3种C# Timer用法的解释: (1)System.Windows.Forms.Timer 应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或D