使用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 * */ });