使用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()并且当前这不会发生,执行delay()之后执行someMethod()没有5秒延迟

您当前的代码设置计时器,然后立即执行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(); 

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

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

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

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

如果您使用的是.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将在ThreadPool线程中调用someMethod ,如果您正在访问UI,则需要封送对UI线程的调用。

你需要在计时器的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()); } 
 System.Threading.Tasks.Task.Factory.StartNew(() => { System.Threading.Thread.Sleep(5000); /* * Here Yopur code to do some method :D * */ });