繁体   English   中英

ASP.NET,.NET 4.5.1引用的DLL在C#中的对象池

[英]Object Pooling in c# for dll referenced by asp.net, .Net 4.5.1

我指的是一个(黑匣子)dll,它具有非常昂贵的初始化(需要3-4秒)。 有数百个同时用户的asp.net应用程序使用它。

由于初始化费用昂贵,因此无法将其用作实例变量。 我的第一个想法是将实例存储在静态变量中,并使用c#lock()方法来避免出现竞争情况。 这可以正常工作,但是显然,当多个用户想要同时访问该库时,围绕单个静态变量的lock()方法将效率很低。

我想实现一个对象池,以便可以使用该库的多个实例。 我不能使用COM +。 当ASP.NET应用程序使用该对象池时,在C#.Net 4.5.1中实现对象池的最佳方法是什么?

对此MSDN文章的很多引用都建议使用ConcurrentBag,但是许多人说,当单个线程从池中添加/删除项目时,这种方法最有效。 以我为例,多个线程将要添加/删除项目,因此,这种方法似乎不是适用于asp.net的方法,但是如果我在声明方面有误,请纠正我: https : //msdn.microsoft.com/ zh-CN / library / ff458671(v = vs.110).aspx

我发现此答案非常有用,但它已过时: C#对象池模式实现

ConcurrentBag是对象池的最佳结构。

您误解了“在单个线程从池中添加/删除项目时这种方法最有效”的建议。 更好的说法是“当从池中删除线程时,与将对象放入池中的线程相同的可能性很高, ConcurrentBag工作效果最佳” ,这正是您的对象池将要执行的操作。

ConcurrentBag工作方式是每个线程都有一个线程本地对象集合。 当您添加到ConcurrentBag它会插入到该线程本地集合中,当您从ConcurrentBag删除时,它首先会尝试从线程本地集合中删除,但如果为空,它将转到另一个线程并将其从另一个线程的集合中删除。

因此,建议添加与删除相同的线程的原因是,这样您就不必将两个带有锁的列表捆绑在一起,而不是将单个列表捆绑在一起。

您甚至可以使用单个线程来填充池,然后当工作人员取出项目时,它们将从初始化线程的池中窃取,但随后将其从自己的池中拉回到自己的池中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM