Task.Delay 在等待期间会浪费系统资源吗?

3
我想定期运行一段编程代码,并在其中设置时间间隔。可能会有多个这样的代码片段同时运行,因此我使用了Task.Run来利用异步方法调用和并行处理。现在我想知道如何实现时间间隔!
直接的方法是像这样使用Task.Delay
var t = Task.Run(async delegate 
{ 
   await Task.Delay(1000); 
   return 42; 
});

但我想知道这样做是否是正确的方式,因为我相信所有的 Task.Delay 做的只是让线程休眠,并在时间结束后恢复它(尽管我不确定)。如果是这种情况,那么系统必须支付任务线程资源的成本,即使任务没有运行。

如果是这种情况,有没有任何方法可以在一段时间后运行任务而不浪费任何系统资源?


是的,请使用 System.Threading.Timer - Matthew Watson
1
@MatthewWatson 这正是 Delay 函数所使用的计时器。 - user2586804
1
await Task.Delay(1000) 不会阻塞线程,不像 Task.Delay(1000).Wait() 会这样做,更多细节 - noseratio - open to work
@user2586804 是的,正如这里所解释的那样:https://dev59.com/c2Qm5IYBdhLWcg3wuhDS - Matthew Watson
1个回答

11

Task.Delay不会导致线程休眠,而是使用计时器。


1
你认为 Task.Delay 是推迟任务开始的正确/最佳方式吗?就像上面那段代码一样?你能否提供一个参考作为你话语的证据?谢谢。 - Mehran
1
@user2586804:不行。@Mehran:如果你有一个周期性的动作(例如,每5秒钟该动作应该开始一次),那么最好使用定期计时器来启动它;如果你有一个周期性的延迟(例如,做某事,等待5秒钟,做某事,等待5秒钟等等),那么Task.Delay会更清晰。据我所知,没有官方文档说明Delay使用了计时器,但因为它是异步的,你知道它不能阻塞调用线程。 - Stephen Cleary
2
@Mehran 请查看这个帖子,他们在讨论Task.Delay的实现:https://dev59.com/c2Qm5IYBdhLWcg3wuhDS - Matthew Watson
1
@user2586804:没有任何时候线程会被阻塞或自旋等待超时。在编写良好的 UI 应用程序中,不会有“等待”(这将导致线程被阻塞)。 - Stephen Cleary
是的,为了回答他问题的另一部分(我知道他已经接受了答案,所以显然他明白其中的含义,但我还没解释清楚),这个 Task.Delay 会或不会浪费资源? - user2586804
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接