首页 > 解决方案 > Sync over Async - 线程使用说明

问题描述

我在NDC看到了 David fowler 和 Demian,他们谈到了扩展。

在演示开始时,他们问观众:“这段代码涉及多少线程:”

void Main()
{
    Task.Delay(1000).Wait();
}

然后@jonskeet 说:“至少 2 个”。

第一个线程是主线程,我可以假设第二个线程是延迟(计时器)使用的线程,它最后从线程池中获取另一个线程(我希望我是对的)。这里没有等待。所以我认为这里没有状态机。

问题

但是为什么另一个线程还有另一个选项?(他说至少2个)。有人可以澄清这个简单示例中的线程用法是什么吗?

标签: c#async-await

解决方案


但是为什么另一个线程还有另一个选项?

推测,但是:我们知道每个延迟没有操作系统级别的计时器;相反,作为实现细节,有一个挂起计时器的链表(按超时排序),并且只有第一个节点实际上被调度到操作系统。

现在想象一下操作系统级别的超时触发器;它需要做很多事情:

  • 激活所有具有相同超时值的项目的回调
  • 为下一个项目安排操作系统超时,稍后超时
  • 簿记

基础架构代码可能不希望一个缓慢编写的回调延迟所有其他回调,因此它几乎可以肯定地将回调激活交给线程池,而不是同步调用回调。有可能,但不能保证,簿记等会发生得足够快,以至于同一个工作线程从池中获取回调;一个更可能的选择是一个不相关的线程池线程处理它。

所以; 我们有

  • 你的主线程
  • 处理操作系统超时并将回调调度到线程池的线程
  • 拾取回调的线程池线程

推荐阅读