如果优先选择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!我对来自互联网和微软官方书籍的社区观点感到困惑
如果任务延迟是一个很好的实践,为什么这本书不以任何方式解决它
还是我错过了什么?

如果优先选择Task.Delay而不是Thread.Sleep,那么为什么本书中的示例使用Thread.Sleen

另一个问题涉及真实世界的代码;你的书中有一些代码示例,它们完全不同。

代码示例:

如果希望阻塞当前线程,即模拟一些同步/CPU绑定的工作,则Thread.Sleep是合适的。

如果不想阻塞当前线程,也就是说,您正在模拟一些异步/i/O绑定的工作,那么Task.Delay是合适的。

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

请注意,在真实世界的代码中,像这样的Thread.SleepTask.Delay的任何"占位符"用法都会被真实代码所取代。

在现实世界的代码中,Task.Delay对于延迟重试之类的事情仍然很有用。Thread.Sleep不应出现在真实世界的代码中。

Exam 70-483适用于Visual Studio 2012,当时C#没有async/await。

此外,Thread.Sleep()只是用来指示正在进行的工作。