我正在阅读考试参考文献70-483:Wouter de Kort编写的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);
});
等等......
从this这样的其他阅读/ SO问题中,我想到了
await Task.Delay(1000)
通常应该在并行环境中比
做得更好Thread.Sleep(1000)
因为Task.Delay不受阻碍地保留了它的线程,因此允许其他任务执行
我只是按Ctrl-F'd这本书,它没有找到Task.Delay的一次出现!
我对来自互联网和微软官方书籍的社区意见感到困惑
如果Task.Delay是一个好习惯,为什么本书不以任何方式解决它?
或者我错过了什么?
答案 0 :(得分:1)
other question处理真实世界的代码;你书中的内容是代码示例,它们完全不同。
代码示例:
Thread.Sleep
适用于希望阻止当前线程 - 即,您正在模拟某些同步/ CPU绑定工作。
Task.Delay
是合适的 - 即,您正在模拟一些异步/ I / O绑定的工作。
对于您发布的特定示例(Parallel.For
和Task.Run
中的代码),我认为Thread.Sleep
是最合适的。 Parallel.For
和Task.Run
专门用于在不同的线程上运行CPU绑定代码,因此Thread.Sleep
的同步“占位符”是正确的。
请注意,在实际代码中,Thread.Sleep
和Task.Delay
这样的任何“占位符”用法都会被实际代码替换。
在实际代码中,Task.Delay
对延迟重试等内容仍有用。 Thread.Sleep
不应该是真实世界的代码。
答案 1 :(得分:0)
考试70-483适用于Visual Studio 2012,当时C#没有异步/等待。
此外,Thread.Sleep()
就是指示正在完成的工作。