C# winform中timer的问题

privatevoidForm1_Load(objectsender,EventArgse){this.timer1.Enabled=true;this.timer1.I... private void Form1_Load(object sender, EventArgs e)
{
this.timer1.Enabled = true;
this.timer1.Interval = 1000;
this.timer1.Tick += new EventHandler(this.timer1_Tick);
this.timer1.Start();

}
private void timer1_Tick(object sender, EventArgs e)
{
m = m + 1;
textBox1.Text = m.ToString();
}
本来想做一个1s钟的计时器,可是加上 this.timer1.Tick += new EventHandler(this.timer1_Tick)每次就加2S,这是怎么回事
展开
 我来答
fujie724
2013-12-06 · TA获得超过1187个赞
知道小有建树答主
回答量:154
采纳率:100%
帮助的人:275万
展开全部
你好,因为你的事件进行了重复的绑定。
绑定了2次到timer1_Tick函数上,所以每过一秒就运行2次。

当你把这个控件拖到界面上,并进行双击的时候,就已经绑定了一次事件了。
所以你Form1_Load代码里的那句
this.timer1.Tick += new EventHandler(this.timer1_Tick);

是不需要的。删掉后,另一句会正常工作。

另外一句是写在窗体的designer.cs里面的。
你在designer.cs里搜索“timer1.Tick”可以发现他。

谢谢采纳
更多追问追答
追问
可是我不删除this.timer1.Tick += new EventHandler(this.timer1_Tick),把textBox1.Text = m.ToString()换成MessageBox(m.ToString());就可以正常加上去,这是又是怎么回事?
追答
这是因为MessageBox是一个会阻塞主线程的函数。

MessageBox会弹出一个模式对话框,直到你按下确定之前,程序都不会运行,会卡住。
然而。
每当过一秒的时候,你的timer1_Tick函数会执行两次。

每一次都是+1.
但是每次+1之后都会显示MessageBox,所以你看到的是连续的变化
1,2,3,4,5,6

当你采用textBox1.Text = m.ToString()时。

结果会直接显示到textBox1上,由于执行两次是在极短的时间内发生的(可以视为同时,但是计算机是没有绝对的同时的),所以你看到的是+2的变化。但实际上还是每次+1,只是每秒执行2次。
1,3,5。

明白了么。
xtfnpgy
2013-12-06 · TA获得超过1784个赞
知道大有可为答主
回答量:1989
采纳率:76%
帮助的人:1102万
展开全部
你去掉this.timer1.Tick += new EventHandler(this.timer1_Tick); 这一句,直接给timer1的Trick事件赋值试试;感觉应当是Trick执行了2次。
追问
执行了两次的话也应该会显示一下变化的过程吧?上面那个程序只显示1,3,5……
追答
你可以在后面加一句sleep试试:
private void timer1_Tick(object sender, EventArgs e)
{
m = m + 1;
textBox1.Text = m.ToString();

System.Threading.Thread.Sleep(1000);//这样就可以看到过程了
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
626878724
2013-12-06
知道答主
回答量:35
采纳率:0%
帮助的人:18.4万
展开全部
界面和代码注册事件不要同时使用,这是个不好的习惯,谢谢!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式