我有一个漫长的运行过程,需要经常在Active Directory上进行大量查询.为此,我一直在使用Directory.DirectoryServices命名空间,使用DirectorySearcher和DirectoryEntry类.我注意到应用程序中存在内存泄漏.
可以使用以下代码复制:
while (true)
{
using (var de = new DirectoryEntry("LDAP://hostname", "user", "pass"))
{
using (var mySearcher = new DirectorySearcher(de))
{
mySearcher.Filter = "(objectClass=domain)";
using (SearchResultCollection src = mySearcher.FindAll())
{
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这些类的文档说如果没有调用Dispose(),它们将泄漏内存.我试过没有处理过,它只是泄漏了更多的内存.我用框架版本2.0和4.0测试了这个以前有人遇到过这个吗?有没有解决方法?
更新:我尝试在另一个AppDomain中运行代码,它似乎也没有帮助.
我收到以下与使用DirectorySearcher.FindOne()或查询AD相关的间歇性错误
FindAll().
System.OverflowException: Arithmetic operation resulted in an overflow.
at System.DirectoryServices.SearchResultCollection.ResultsEnumerator.GetCurrentResult()
at System.DirectoryServices.SearchResultCollection.ResultsEnumerator.get_Current()
at System.DirectoryServices.SearchResultCollection.ResultsEnumerator.System.Collections.IEnumerator.get_Current()
Run Code Online (Sandbox Code Playgroud)
这是在一个Web应用程序中发生的,似乎是在应用程序运行了几个小时后发生的.
这是Microsoft Connect上的文档问题,但看起来它已标记为"不可重现"并已关闭.
我在这里找到的唯一解决方案是定期回收应用程序池,这是一个相当苛刻的解决方法,当用户处于工作中时不可行.
有没有人经历过这个,如果是这样,这是如何解决的?
我曾尝试使用缓存,但这只会延迟不可避免的事情,直到你达到AD调用次数的某个阈值,因为人们已经报告每次调用API时它会泄漏内存.
任何帮助将非常感激.