如果要优先使用Thread.Sleep来处理Task.Delay,为什么本书中的示例使用Thread.Sleep?

时间:2015-12-07 07:53:32

标签: c# async-await task-parallel-library

我正在阅读考试参考文献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是一个好习惯,为什么本书不以任何方式解决它?
或者我错过了什么?

2 个答案:

答案 0 :(得分:1)

other question处理真实世界的代码;你书中的内容是代码示例,它们完全不同。

代码示例:

Thread.Sleep适用于希望阻止当前线程 - 即,您正在模拟某些同步/ CPU绑定工作。

如果想要阻止当前线程,那么

Task.Delay是合适的 - 即,您正在模拟一些异步/ I / O绑定的工作。

对于您发布的特定示例(Parallel.ForTask.Run中的代码),我认为Thread.Sleep是最合适的。 Parallel.ForTask.Run专门用于在不同的线程上运行CPU绑定代码,因此Thread.Sleep的同步“占位符”是正确的。

请注意,在实际代码中,Thread.SleepTask.Delay这样的任何“占位符”用法都会被实际代码替换。

在实际代码中,Task.Delay对延迟重试等内容仍有用。 Thread.Sleep不应该是真实世界的代码。

答案 1 :(得分:0)

考试70-483适用于Visual Studio 2012,当时C#没有异步/等待。

此外,Thread.Sleep()就是指示正在完成的工作。