仅使用定时器一次

8

我想在主窗体初始化后的1秒钟内只使用一个计时器。

我认为以下代码只会有一次弹出“Hello World”的消息框,但实际上每隔1秒钟都会弹出新的消息框。

为什么会这样呢?我已经在tick事件中使用了t.Stop()

另外,我是否需要以某种方式处理计时器以避免内存泄漏?

        Timer t = new Timer();
        t.Interval = 1000;                
        t.Tick += delegate(System.Object o, System.EventArgs e)
                        { MessageBox.Show("Hello World"); t.Stop(); };

        t.Start();   

请帮忙并展示是否有更好的方法来完成这个任务? 谢谢。

3个回答

9

MessageBox.Show("Hello World"); t.Stop();替换为t.Stop();MessageBox.Show("Hello World");。因为你没有及时按下OK,计时器已经再次触发,而你从未到达停止代码。


好的,可以了。谢谢。 但是这个逻辑是什么? 为什么顺序很重要? - zaidwaqi
@zaidwaqi:线程进入MessageBox.Show方法,直到你按下OK才离开。但是你没有足够快地按下OK,它已经打开了一个新的MessageBox。 - Yuriy Faktorovich
那么定时器的处理呢?由于定时器不再使用,需要进行处理吗? - zaidwaqi
@zaidwaqi,你可以在t.Stop()之后调用t.Dispose()。 - Sebastian
只要他不再需要它,他应该一直这样做。@SebastianGodelet - Yuriy Faktorovich

2
MessageBox.Show("Hellow World");之前加上t.Stop();

1
你也可以使用System.Timers.Timer,并将AutoReset设置为false来实现这一点。我正在研究应该使用哪个计时器,而且更喜欢这个,因为它不需要单独的停止命令。
using System;
using System.IO;
using System.Timers;

System.Timers.Timer t = new System.Timers.Timer() {
    Interval = 1000,
    AutoReset = false
};

t.Elapsed  += delegate(System.Object o, System.Timers.ElapsedEventArgs e)
    { Console.WriteLine("Hell");}; 
t.Start();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接