任务延迟(Task.Delay)是非阻塞的吗?

3

Task.Delay 内部使用 System.Threading.Timer。主要问题是 System.Threading.Timer 是否会阻塞我的应用程序?如果我这样做:

await Task.Delay(15)

下面的代码是否利用线程来进行15毫秒操作?还是使用操作系统来进行回调。如何查找有关此信息的资料?

.NET线程(在概念上)与操作系统线程不同。您已经从操作系统抽象出了相当多的层次。您真正关心的是什么? - Damien_The_Unbeliever
我只是希望所有东西都是非阻塞的。我很确定它是非阻塞的,否则它就不会成为Task的一种方法。只需要一个证明。不幸的是,我找不到一个。 - Mike Chaliy
只要运行时有效地管理事物,那么使用哪种方式延迟都无关紧要,无论是a)不使用“线程”进行延迟,b)单个线程处理进程中的所有延迟,还是c)为每个请求的延迟消耗一个线程?(也可能有其他选项) - Damien_The_Unbeliever
1个回答

4
根据Jeffrey Richter(第748页)的说法:
线程池内部仅有一个线程用于处理所有计时器对象。该线程知道下一个计时器对象何时到期。当下一个计时器对象到期时,该线程会唤醒,并在内部调用ThreadPool的QueueUserWorkItem将一个条目加入线程池的队列中,从而调用回调方法。
这意味着在计时器执行时,您至少会有两个工作线程:一个是专门用于计时器的内部线程,另一个用于实际的工作进程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接