使用Timer将操作延迟几秒钟

时间:2013-10-15 18:30:57

标签: c# timer

我试图通过使用计时器延迟我的方法:

private System.Timers.Timer _delayTimer;

    private void delay()
    {
          _delayTimer = new System.Timers.Timer();
          _delayTimer.Interval = 5000;
          //_delayTimer.Enabled = true;
          _delayTimer.Elapsed += _delayTimer_Elapsed;
          _delayTimer.Start();
          someMethod();
        }
    }

    private void _delayTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        // delay for 5 seconds
    }

当我进入delay()方法时,我想要启动计时器,而不是我希望5秒延迟,只有在此之后我想执行someMethod()并且目前这不会发生,执行后{ {1}} delay()执行时没有延迟5秒

5 个答案:

答案 0 :(得分:11)

您当前的代码会设置计时器,然后立即执行someMethod。而不是这个,你需要将实际的方法调用放在Elapsed处理程序中:

private void delay()
{
      _delayTimer = new System.Timers.Timer();
      _delayTimer.Interval = 5000;
      //_delayTimer.Enabled = true;
      _delayTimer.Elapsed += _delayTimer_Elapsed;
      _delayTimer.Start();
    }
}

private void _delayTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
      someMethod();
}

如果没有其他任何你打算做的事情,你可以简单地写这个内联:

_delayTimer = new System.Timers.Timer();
_delayTimer.Interval = 5000;
_delayTimer.Elapsed += (o, e) => someMethod();
_delayTimer.Start();

答案 1 :(得分:4)

如果您希望当前线程暂停五秒钟,请拨打Thread.Sleep。例如:

Thread.Sleep(TimeSpan.FromSeconds(5));
DoSomething();

如果你想在现在五秒钟之后发生某些事情,请使用计时器,而你正在做其他事情。当计时器过去时,将在线程池线程上执行该操作。

此外,如果您只希望计时器执行一次(而不是每五秒执行一次),请务必将AutoReset设置为false

答案 2 :(得分:3)

如果你在.Net4.5(或使用BCL.Async包),你可以使用Task.Delay

private async void delay()
{
    await Task.Delay(5000);
    someMethod();
}

如果你在.Net4.5下

尝试以下代码。我建议你使用System.Threading.Timer

var timer = new System.Threading.Timer(x => someMethod(), null, 5000, System.Threading.Timeout.Infinite);\

在使用Threading时不要忘记.Timer someMethod将在ThreadPool线程中调用,如果您正在访问UI,则需要封送对UI线程的调用。

答案 3 :(得分:1)

您需要在计时器的Elapsed处理程序中调用someMethod

private void delay()
{
      _delayTimer = new System.Timers.Timer();
      _delayTimer.Interval = 5000;
      _delayTimer.AutoReset = false; //so that it only calls the method once
      _delayTimer.Elapsed += (s,args) => someMethod();
      _delayTimer.Start();
}

您也可以使用Task.Delay代替:

private void delay()
{
    Task.Delay(5000)
    .ContinueWith(t => someMethod());
}

答案 4 :(得分:1)

System.Threading.Tasks.Task.Factory.StartNew(() =>
            {
                System.Threading.Thread.Sleep(5000);
                /*
                 * Here Yopur code to do some method :D
                 * */
            });