Microsoft.Extensions.ObjectPool为何未生效?归还对象后内部列表无数据
为什么归还对象后在ObjectPool的内部_items列表里看不到?
环境与代码
使用Microsoft.Extensions.ObjectPool v7.0.11版本,在LINQPad v7.7.15中运行以下C#代码:
var pool = ObjectPool.Create<object>(); var thing = pool.Get(); pool.Return(thing); pool.Uncapsulate()._items.Dump();
运行结果
ObjectWrapper<Object>[47] = { null, null, null, null, null, null, ... }
原因说明
- 默认的
DefaultObjectPool<T>实现逻辑里,归还对象时不会直接存入_items数组。它会先把对象暂存到线程本地的栈中,只有当这个栈被填满(默认容量为20),才会将栈内的对象批量转移到_items数组里。 - 你只归还了一个对象,这个对象还留在线程本地栈中,没触发批量转移到
_items的逻辑,所以直接查看_items数组自然找不到它。 - 若要验证这个机制,可以多归还几十个对象(比如超过20个),此时再查看
_items数组,就能看到已归还的对象了。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

