11

我希望 C# 中的计时器在执行后自行销毁。我怎样才能做到这一点?

private void button1_Click(object sender, EventArgs e)
{
    ExecuteIn(2000, () =>
    {
        MessageBox.Show("fsdfs");   
    });           
}

public static void ExecuteIn(int milliseconds, Action action)
{
    var timer = new System.Windows.Forms.Timer();
    timer.Tick += (s, e) => { action(); };
    timer.Interval = milliseconds;
    timer.Start();

    //timer.Stop();
}

我希望这个消息框只显示一次。

4

6 回答 6

29

使用 Timer.AutoReset 属性:
https ://msdn.microsoft.com/en-us/library/system.timers.timer.autoreset(v=vs.110).aspx

IE:

System.Timers.Timer runonce=new System.Timers.Timer(milliseconds);
runonce.Elapsed+=(s, e) => { action(); };
runonce.AutoReset=false;
runonce.Start();

就我而言,在 Tick 方法中停止或处理 Timer 是不稳定的

编辑:这不适用于 System.Windows.Forms.Timer

于 2015-11-07T09:32:27.527 回答
15

我最喜欢的技术是这样做...

Task.Delay(TimeSpan.FromMilliseconds(2000))
    .ContinueWith(task => MessageBox.Show("fsdfs"));
于 2016-07-27T03:37:54.813 回答
7

尝试在计时器进入 Tick 后立即停止计时器:

timer.Tick += (s, e) => 
{ 
  ((System.Windows.Forms.Timer)s).Stop(); //s is the Timer
  action(); 
};
于 2013-05-30T05:06:03.620 回答
0

添加

timer.Tick += (s, e) => { timer.Stop() };

timer.Tick += (s, e) => { action(); };
于 2013-05-30T05:05:50.730 回答
0

在动作之前将timer.Dispose()放在Tick 的方法中(如果动作等待用户的响应,即您的 MessageBox,则计时器将继续运行,直到他们响应为止)。

timer.Tick += (s, e) => { timer.Dispose(); action(); };
于 2013-05-30T05:28:18.987 回答
0

在 Intializelayout() 中写下这个。

this.timer1 = new System.Windows.Forms.Timer(this.components);
this.timer1.Enabled = true;
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);

并在表单代码中添加此方法

private void timer1_Tick(object sender, EventArgs e)
    {
        doaction();
        timer1.Stop();
        timer1.Enabled = false;
    }
于 2013-05-30T06:22:41.963 回答