【问题标题】:How to run a timer in C# only once?如何在 C# 中只运行一次计时器?
【发布时间】:2017-06-30 00:55:38
【问题描述】:

我希望 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();
}

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

【问题讨论】:

    标签: c#


    【解决方案1】:

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

    即:

    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

    【讨论】:

    【解决方案2】:

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

    Task.Delay(TimeSpan.FromMilliseconds(2000))
        .ContinueWith(task => MessageBox.Show("fsdfs"));
    

    【讨论】:

    【解决方案3】:

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

    timer.Tick += (s, e) => 
    { 
      ((System.Windows.Forms.Timer)s).Stop(); //s is the Timer
      action(); 
    };
    

    【讨论】:

    • 自动重置是更好的解决方案
    【解决方案4】:

    添加

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

    之后

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        在 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;
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-14
          • 1970-01-01
          • 1970-01-01
          • 2019-07-28
          • 2021-11-21
          • 1970-01-01
          相关资源
          最近更新 更多