C# 是否';等待任务。延迟(1000)和#x27;阻止任何线程?

C# 是否';等待任务。延迟(1000)和#x27;阻止任何线程?,c#,.net,multithreading,asynchronous,C#,.net,Multithreading,Asynchronous,我已经读到,建议等待Task.Delay()不要阻止调用线程(与Task.Delay().Wait()和thread.Sleep()一样)。但随着我对async/await了解的更多,我感觉它所做的只是将等待的任务转移到另一个线程上执行 那么,我是否正确地理解了它:wait Task.Delay()不会阻止调用线程,但是它会阻止某些线程,等待的任务会转移到哪个线程 如果这句话是真的,那么你能给我一个建议,让任务等待一段时间,而不在等待期间阻塞任何线程吗 但是它阻塞了一些线程,等待的任务转移到了哪

我已经读到,建议等待Task.Delay()不要阻止调用线程(与Task.Delay().Wait()和thread.Sleep()一样)。但随着我对async/await了解的更多,我感觉它所做的只是将等待的任务转移到另一个线程上执行

那么,我是否正确地理解了它:wait Task.Delay()不会阻止调用线程,但是它会阻止某些线程,等待的任务会转移到哪个线程

如果这句话是真的,那么你能给我一个建议,让任务等待一段时间,而不在等待期间阻塞任何线程吗

但是它阻塞了一些线程,等待的任务转移到了哪里

这取决于你所说的“阻塞”是什么意思。它不会导致任何线程进入睡眠状态1秒,或者(更糟糕的)旋转等待延迟完成。相反,它有效地安排一个计时器在1秒内启动,然后执行由于
wait
而注册的继续

在一个稍微简化的层次上,
await
只是转换为:

  • 在等待者上调用
    GetAwaiter
    ,以获取等待者
  • 检查等待者是否已完成-如果已完成,请继续
  • 否则,与等待者安排继续,然后返回
  • 当等待程序完成时,将调用continuation并继续异步方法
聪明的一点是编译器保存状态和管理延续的方式,以便它从
await
表达式的末尾继续


因此,当
Delay()库伯曼8月15日上午10:19


不,您不能在等待任务的同时做其他事情。延迟。下面的指令不会执行,但线程也不会被阻塞!这意味着界面处理仍将正常工作,例如,您可以移动鼠标、单击按钮等。

因此,当延迟()正在进行时,等待的延迟()任务发送到的线程可以用于处理其他任务。@cubrman:您所说的“等待的延迟()任务发送到的位置”是什么意思
Delay()
返回一个
任务
,该任务在一秒钟后完成。。。这并不是一项实际做任何事情的任务。如果您对
System.Timers.Timer
的工作方式(或类似方式)感到满意,则是这样的。@cubrman“延迟”不会发生在进程上。它发生在一个叫做时钟/定时器的硬件上。无论如何,它不会占用CPU程序逻辑部分的资源。@cubrman你的问题就像问“当我设置早上的闹钟时,我大脑的哪一部分负责检查何时起床?”我有一篇博文。但是你可以启动
任务
,做点什么,然后
等待它。