2013-10-08 35 views
1

我试图定期运行一段代码,其间有时间间隔。可能有多个这样的代码块同时运行,所以我转向Task.Run以利用异步方法调用和并行性。现在我想知道我应该如何执行时间间隔!Task.Delay在等待时浪费系统资源吗?

直线前进的道路将使用Task.Delay这样的:

var t = Task.Run(async delegate 
{ 
    await Task.Delay(1000); 
    return 42; 
}); 

但我不知道,如果这样做是做正确的方式,因为我相信所有的Task.Delay不就是睡觉的线程,并恢复它一旦期限结束(即使我不确定)。如果是这种情况,那么系统即使在任务未运行时也必须支付任务的线程资源。

如果是这样的话,有没有办法在一段时间后运行一个任务而不会浪费任何系统资源?

+0

是的,使用['System.Threading.Timer'](http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx) –

+1

@MthetheWWatson恰恰是计时器'延迟'正在使用。 – user2586804

+1

'await Task.Delay(1000)'不会阻塞线程,不像'Task.Delay(1000).Wait()'会做的,[更多细节](http://stackoverflow.com/a/19090043/ 1768303)。 – Noseratio

回答

7

Task.Delay不会导致线程进入睡眠状态。它使用一个计时器。

+1

你会说'Task.Delay'是推迟任务开始的正确/最佳方式?如上面的代码?你能否请一个参考作为你的单词的证据?谢谢。 – Mehran

+1

@ user2586804:不可以@Mehran:如果你有*周期*动作(例如,每5秒动作应该开始),那么使用周期性计时器来启动它可能会更好;如果你有一个周期性的延迟(例如,做某事,等待5秒钟,做点什么,等待5秒等等),那么'Task.Delay'会更干净。 AFAIK没有官方文档说“Delay”使用定时器,但是因为它是异步的,所以它不能*阻止调用线程。 –

+2

@Mehran看到这个线程,他们谈论Task.Delay的实现:http://stackoverflow.com/questions/17378548/what-it-costs-to-use-task-delay –