所有活动的ThreadLocal <T>和[ThreadStatic]引用的列表

Hug*_*une 5 c# reflection static multithreading .net-4.0

如何获取当前保存ThreadLocal或ThreadStatic存储的所有引用的列表?

即所有无法收集垃圾的对象,因为某些线程在其线程本地存储中保存对此对象的引用.

我可以使用反射来查找这些实例,或者至少是它们的总大小,而不知道它们的名称或类型吗?

或者失败了,某种方式在Visual Studio 2010中显示它们?(我正在寻找除了完整的内存分析器之外的东西)

我的动机是:我只是有一个非常讨厌的内存泄漏,其中a的内容ConcurrentBag由各种ThreadPool线程持有,即使最初的ConcurrentBag已经超出范围并且收集了垃圾.虽然我压扁了这个特殊的bug,但我想知道是否还有更多这样的bug.

理想情况下,我想在运行时定期记录线程本地存储所拥有的对象数量及其大小.

War*_*War 2

不幸的是没有办法做到这一点。

相反,您应该确保使用 IDisposable 实现进行清理,并在适当的情况下使用(某些 IDisposable)。

框架本身确实会为您计算引用,但没有 API 可以将此信息公开给正在运行的代码。