如果优先选择Task.Delay而不是Thread.Sleep,那么为什么本书中的示例使用Thread.Sleen
本文关键字:Thread 为什么 Sleen Task 选择 Delay 如果 Sleep | 更新日期: 2023-09-27 18:25:52
我正在阅读Wouter de Kort的Exam Ref 70-483:Programming in C#
作者没有明确提到C#的版本,但我猜它是5.0,因为他大量使用async/await关键字。
本书中的例子只使用Thread.Sleep()而不使用Task.Delay()
Parallel.For(0, 10, i =>
{
Thread.Sleep(1000);
});
,
Task.Run(() =>
{
bag.Add(42);
Thread.Sleep(1000);
bag.Add(21);
});
等等…
从其他类似的阅读/SO问题中,我认为
await Task.Delay(1000)
在并行环境中通常应该比做得更好
Thread.Sleep(1000)
因为Task.Delay使其线程不受阻碍,从而允许其他任务在其上执行。
我刚按了一下这本书,它没有找到一个Task。Delay!我对来自互联网和微软官方书籍的社区观点感到困惑
如果任务延迟是一个很好的实践,为什么这本书不以任何方式解决它
还是我错过了什么?
另一个问题涉及真实世界的代码;你的书中有一些代码示例,它们完全不同。
代码示例:
如果希望阻塞当前线程,即模拟一些同步/CPU绑定的工作,则Thread.Sleep
是合适的。
如果不想阻塞当前线程,也就是说,您正在模拟一些异步/i/O绑定的工作,那么Task.Delay
是合适的。
对于您发布的特定示例(Parallel.For
和Task.Run
中的代码),我认为Thread.Sleep
是最合适的。Parallel.For
和Task.Run
专门用于在不同的线程上运行CPU绑定的代码,因此Thread.Sleep
的同步"占位符"是正确的。
请注意,在真实世界的代码中,像这样的Thread.Sleep
和Task.Delay
的任何"占位符"用法都会被真实代码所取代。
在现实世界的代码中,Task.Delay
对于延迟重试之类的事情仍然很有用。Thread.Sleep
不应出现在真实世界的代码中。
Exam 70-483适用于Visual Studio 2012,当时C#没有async/await。
此外,Thread.Sleep()
只是用来指示正在进行的工作。