使用Timer将操作延迟几秒钟

use*_*609 1 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
    }
Run Code Online (Sandbox Code Playgroud)

当我进入delay()方法我想开始计时,比我想的延时5秒,之后才是我想要执行someMethod(),目前这不会发生,执行后delay()someMethod()无延时5秒执行

Jon*_*Jon 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();
}
Run Code Online (Sandbox Code Playgroud)

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

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


Sri*_*vel 6

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

private async void delay()
{
    await Task.Delay(5000);
    someMethod();
}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是 .Net4.5

试试下面的代码。我会建议你使用System.Threading.Timer

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

不要忘记当您使用 Threading.Timer 时someMethod将在ThreadPool线程中调用,如果您正在访问 UI,则需要将调用编组到 UI 线程。


Jim*_*hel 5

如果您希望当前线程暂停五秒钟,则调用Thread.Sleep. 例如:

Thread.Sleep(TimeSpan.FromSeconds(5));
DoSomething();
Run Code Online (Sandbox Code Playgroud)

如果您希望从现在起五秒钟后发生某事,而您正在做其他事情,请使用计时器。当计时器结束时,该操作将在线程池线程上执行。

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