.NET 6中IO操作忙等待遇Thread.Yield()延迟,内存转储后立即完成
.NET 6下Faster库结合Thread.Yield()的异常延迟问题
问题场景
- 业务逻辑使用Faster库存储KV数据并将数据溢写到磁盘,写入完成后通过调用
CompletePending()方法,配合Thread.Yield()忙等待,直到方法返回true,以此确保所有待处理操作完成。 - 原.NET Framework 4.7.1环境下该流程运行正常,通常几秒内完成,最多不超过1分钟;但迁移到.NET 6后,完成时间直接超过5分钟。
- 移除超时和
Thread.Yield()后问题暂时缓解,但后续调用Faster内部同样用Thread.Yield()忙等待的DisposeFromMemory()时,原本最多几秒的操作,现在需要10-20分钟才能完成。两者的共同点均为使用了Thread.Yield()。 - 机器IO指标全程正常,问题可稳定复现。
异常现象
- 最特殊的一点:当对进程获取内存转储后,原本卡住的
CompletePending()或DisposeFromMemory()会立即完成。 - 分析内存转储未发现异常,执行
!clrstack仅显示线程卡在Thread.Yield()处;仅存在一条IOCP线程抛出ObjectDisposedException,栈跟踪涉及SslStream,但该线程不属于业务代码逻辑。
调试验证结果
- 定位到
Thread.Yield()是问题核心:将忙等待逻辑改为Thread.Sleep(100)后,操作可在1分钟内完成;但替换为Thread.Sleep(0)或SpinWait时,延迟问题依旧存在。 - 升级Faster库至最新版本,未解决该问题。
待解疑问
- 为何.NET 6环境下
Thread.Yield()会引发如此严重的延迟? - 内存转储操作为何能触发卡住的操作立即完成?
内容的提问来源于stack exchange,提问作者bearwithme
相关产品推荐
相关产品推荐

