c# - Sync over Async - 线程使用说明
问题描述
我在NDC看到了 David fowler 和 Demian,他们谈到了扩展。
在演示开始时,他们问观众:“这段代码涉及多少线程:”
void Main()
{
Task.Delay(1000).Wait();
}
然后@jonskeet 说:“至少 2 个”。
第一个线程是主线程,我可以假设第二个线程是延迟(计时器)使用的线程,它最后从线程池中获取另一个线程(我希望我是对的)。这里没有等待。所以我认为这里没有状态机。
问题
但是为什么另一个线程还有另一个选项?(他说至少2个)。有人可以澄清这个简单示例中的线程用法是什么吗?
解决方案
但是为什么另一个线程还有另一个选项?
推测,但是:我们知道每个延迟没有操作系统级别的计时器;相反,作为实现细节,有一个挂起计时器的链表(按超时排序),并且只有第一个节点实际上被调度到操作系统。
现在想象一下操作系统级别的超时触发器;它需要做很多事情:
- 激活所有具有相同超时值的项目的回调
- 为下一个项目安排操作系统超时,稍后超时
- 簿记
基础架构代码可能不希望一个缓慢编写的回调延迟所有其他回调,因此它几乎可以肯定地将回调激活交给线程池,而不是同步调用回调。有可能,但不能保证,簿记等会发生得足够快,以至于同一个工作线程从池中获取回调;一个更可能的选择是一个不相关的线程池线程处理它。
所以; 我们有
- 你的主线程
- 处理操作系统超时并将回调调度到线程池的线程
- 拾取回调的线程池线程
推荐阅读
- c# - 基类属性的通用方法设置值
- node.js - 如何使用 Firebase Auth 注册/登录/铸造令牌,但使用 Mongodb 进行其他所有操作?
- json - 用于将 curl 数据提取到 Google 表格的 Google 脚本功能
- sql-server - 根据 EF Core 中的二级索引获取数据
- node.js - 无法在 WebStorm 中运行 Jest
- django - 如何使用 Sendgrid 从部署在 Heroku 中的 Django 应用程序发送重置密码电子邮件?
- flutter - 未来
- > 无法分配给列表
- algorithm - 优化算法以在 4 秒内运行大量操作
- php - 在 magento 1.9 中上传图片
- javascript - React Navigation V5:导航到不同的屏幕