如果 Task.Delay 优于 Thread.Sleep,为什么本书中的示例使用 Thread.Sleep?
If Task.Delay is to be prefered over Thread.Sleep, why examples in this book use Thread.Sleep?
我正在阅读考试参考 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);
});
等等等...
从其他 reading/SO 问题,如 this,我认为
await Task.Delay(1000)
在并行上下文中通常应该比
做得更好
Thread.Sleep(1000)
因为 Task.Delay 使其线程不受阻碍,从而允许其他任务在其上执行。
我刚刚按 Ctrl-F 键打开了这本书,但没有找到 Task.Delay 出现的地方!
我对来自 Internet 的社区意见和 Microsoft 官方书籍感到困惑。
如果 Task.Delay 是一个好习惯,为什么本书不以任何方式解决它?
还是我漏掉了什么?
考试 70-483 是 Visual Studio 2012 年的考试,当时 C# 还没有 async/await。
此外,Thread.Sleep()
只是表示工作正在进行。
other question处理真实世界的代码;你书里的都是代码示例,完全不一样
代码示例:
如果您 想要 阻塞当前线程,则 Thread.Sleep
是合适的 - 即,您正在模拟一些同步/CPU 绑定工作。
如果您 不想 阻塞当前线程,则 Task.Delay
是合适的 - 即,您正在模拟一些异步/I/O-bound 工作。
对于您发布的特定示例(Parallel.For
和 Task.Run
中的代码),我认为 Thread.Sleep
是最合适的。 Parallel.For
和 Task.Run
专门用于不同线程上的 运行 CPU 绑定代码,因此 Thread.Sleep
的同步 "placeholder" 是正确的。
请注意,在实际代码中,Thread.Sleep
和 Task.Delay
的任何 "placeholder" 用法都将替换为实际代码。
在实际代码中,Task.Delay
对于延迟重试之类的事情仍然很有用。 Thread.Sleep
不应出现在实际代码中。
我正在阅读考试参考 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);
});
等等等...
从其他 reading/SO 问题,如 this,我认为
await Task.Delay(1000)
在并行上下文中通常应该比
做得更好Thread.Sleep(1000)
因为 Task.Delay 使其线程不受阻碍,从而允许其他任务在其上执行。
我刚刚按 Ctrl-F 键打开了这本书,但没有找到 Task.Delay 出现的地方!
我对来自 Internet 的社区意见和 Microsoft 官方书籍感到困惑。
如果 Task.Delay 是一个好习惯,为什么本书不以任何方式解决它?
还是我漏掉了什么?
考试 70-483 是 Visual Studio 2012 年的考试,当时 C# 还没有 async/await。
此外,Thread.Sleep()
只是表示工作正在进行。
other question处理真实世界的代码;你书里的都是代码示例,完全不一样
代码示例:
如果您 想要 阻塞当前线程,则Thread.Sleep
是合适的 - 即,您正在模拟一些同步/CPU 绑定工作。
Task.Delay
是合适的 - 即,您正在模拟一些异步/I/O-bound 工作。
对于您发布的特定示例(Parallel.For
和 Task.Run
中的代码),我认为 Thread.Sleep
是最合适的。 Parallel.For
和 Task.Run
专门用于不同线程上的 运行 CPU 绑定代码,因此 Thread.Sleep
的同步 "placeholder" 是正确的。
请注意,在实际代码中,Thread.Sleep
和 Task.Delay
的任何 "placeholder" 用法都将替换为实际代码。
在实际代码中,Task.Delay
对于延迟重试之类的事情仍然很有用。 Thread.Sleep
不应出现在实际代码中。