ObjectPool或类似的东西已经存在于.NET中?我不想自己写,因为我担心我可能会遗漏一些东西和/或抄袭其他人的工作,那么.NET库中是否有ObjectPool(或类似)类?通过对象池,我的意思是帮助缓存需要很长时间创建的对象的类,通常是为了提高性能。更新:我还想出了来自TPLDataFlow的BufferBlock。IIRC现在是.net的一部分。BufferBlock的特点是您可以使用Post和ReceiveAsync扩展方法异步等待项目可用。在异步/等待世界中非常方便。原始答案我不久前遇到了这个问题,并提出了一个轻量级(已经很粗糙)线程安全(我希望)的池,它已被证明非常有用、可重用和健壮:publicclassPoolwhereT:class{私有只读队列>asyncQueue=新队列>();私有只读函数createFunction;私有只读哈希集池;私人只读行动重置功能;publicPool(FunccreateFunction,ActionresetFunction,intpoolCapacity){赋this.createFunctionset=createFunction=resetFunction;pool=newHashSet();创建池项目(池容量);}publicPool(FunccreateFunction,intpoolCapacity):this(createFunction,null,poolCapacity){}publicintCount{get{returnpool.Count;}}privatevoidCreatePoolItems(intnumItems){for(vari=0;i0){varresult=asyncQueue.Dequeue();结果.SetAsCompletedAsync(项目);返回;}}锁(池){pool.Add(项目);}}publicTPop(){Titem;锁(池){如果(池。计数==0){返回空;}item=pool.First();池。删除(项目);}归还物品;}公共IAsyncR结果BeginPop(AsyncCallback回调){varresult=newAsyncResult();结果.AsyncCallback=回调;锁(池){如果(pool.Count==0){锁(asyncQueue){asyncQueue.Enqueue(结果);返回结果;}}varpoppedItem=pool.First();pool.Remove(poppedItem);结果.SetAsCompleted(poppedItem);返回结果;}}publicTEndPop(IAsyncResultasyncResult){varresult=(AsyncResult)asyncResult;返回结果。结束调用();}}为避免池对象的任何接口要求,对象创建和重置由用户提供的委托执行:即PoolmsPool=newPool(()=>newMemoryStream(2048),pms=>{pms.Position=0;pms.SetLength(0);},500);万一池是空的,BeginPop/EndPop对提供了一个APM(ish)方法来在对象可用时异步检索对象(使用JeffRichter优秀的AsyncResult实现)我不太确定为什么它会是T:class...那么可能不会。在即将发布的.NET(4.0)版本中,有一个ConcurrentBag类可以很容易地在ObjectPool实现中使用;事实上,MSDN上有一篇文章向您展示了如何操作。如果您无法访问最新的.NET框架,您可以从Microsoft的ReactiveExtensions(Rx)库(在System.Threading中)获取.NET3.5中的System.Collections.Concurrent命名空间(带有ConcurrentBag)。动态链接库)。CodeProject有一个示例ObjectPool实现。在这里查看。或者,这里、这里和这里有一些实现。System.Collections.Generic.Dictionary怎么样?听起来你需要一个带缓存的工厂模式。您可以尝试.netreflector来查看ThreadPool实现。C#学习教程就这些了:ObjectPool或类似的东西已经存在于.NET中?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
