walterlv / BlogComments

3 stars 0 forks source link

post/sleep-delay-zero-vs-yield #61

Open utterances-bot opened 4 years ago

utterances-bot commented 4 years ago

C#/.NET 中 Thread.Sleep(0), Task.Delay(0), Thread.Yield(), Task.Yield() 不同的执行效果和用法建议 - walterlv

C#/.NET 中 Thread.Sleep(0), Task.Delay(0), Thread.Yield(), Task.Yield() 不同的执行效果和用法建议

https://blog.walterlv.com/post/sleep-delay-zero-vs-yield.html

KuHai-A commented 4 years ago

请问,最后“另外,如果等待时使用 Task.Delay 而不是 Thread.Sleep,那么你可以节省一个线程的资源”这句话如何理解? 这句话是跟随上一句使用async/await的吧,也就是说使用await Task.Delay而不是Thread.Sleep。 await Task.Delay是内部开启了一个新线程然后等待了X毫秒吗?然后调用线程可以继续工作。这样是总共两个线程,分别不耽误工作。 Thread.Sleep堵塞了当前线程,但也没有开启第二个线程。 所以,如何理解节省了一个线程的资源?还是我哪里理解的有误,麻烦指导。

walterlv commented 4 years ago

@KuHai-A 可能我这段话的描述缺少了一个前提条件——对于一般产品/项目来说。

  1. 通常,一个产品/项目不会只有一个线程或两个线程工作,而是会有好多个。
  2. 使用 Task.Delay 的等待是共用了一个计时的线程,而这个线程在统一管理的现成池中。
  3. Thread.Sleep 没有使用任何现成的线程资源,而是直接将当前线程阻塞。 基于以上三点,Thread.Sleep 会阻塞当前线程,而 Task.Delay 因为在一般项目中复用了现有的线程从而节省了资源。
KuHai-A commented 4 years ago

@walterlv 谢谢耐心解答,这下理解了