我试图通过使用计时器延迟我的方法:
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秒
答案 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
* */
});