我在using语句中使用DirectorySearcher来遍历大约5000个对象。通过故障排除显示,PropertiesToLoad属性导致大量内存泄漏。如果我在每个对象上设置propertiesToLoad属性,我的程序将从0到2 GB的内存空闲时使用。通过这种方式,搜索速度非常快,但内存泄漏。
如果我在开始时而不是在每个循环上设置PropertiesToLoad,则不会发生内存泄漏,但搜索速度很慢。我已经尝试清除每个循环上的属性,修复内存泄漏,但再次导致搜索速度减慢。我希望能在这里找到两全其美。
注意:我的应用程序是多线程的,因此AD搜索一次发生在10个线程上。
using (DirectorySearcher mySearcher = new DirectorySearcher(new DirectoryEntry("LDAP://rootDSE", null, null, AuthenticationTypes.FastBind)))
{
try
{
mySearcher.Filter = ("(&(objectClass=user)(sAMAccountName=" + object + "))");
mySearcher.SearchScope = SearchScope.Subtree;
mySearcher.CacheResults = false;
mySearcher.PropertiesToLoad.AddRange(new string[] { "canonicalName", "displayName", "userAccountControl" });
foreach (SearchResult result in mySearcher.FindAll())
{
try
{
shareInfo.displayname = result.Properties["displayName"][0].ToString();
}
catch
{
shareInfo.displayname = "N/A";
}
shareInfo.canName = result.Properties["canonicalName"][0].ToString();
int userAccountControl = Convert.ToInt32(result.Properties["userAccountControl"][0]);
bool disabled = ((userAccountControl & 2) > 0);
if (disabled == true)
shareInfo.acctstatus = "Disabled";
else
shareInfo.acctstatus = "Enabled";
}
}
catch
{
}
}
答案 0 :(得分:2)
这是我几周前从documentation for the FindAll
method:
由于实施限制,SearchResultCollection类 当它是垃圾时,无法释放所有非托管资源 集。要防止内存泄漏,必须调用Dispose方法 当不再需要SearchResultCollection对象时。
您在using
上使用DirectorySearcher
,但在结果集合上没有使用using (var results = mySearcher.FindAll())
{
foreach (SearchResult result in results)
{
...
}
}
。尝试将结果集合分配给稍后可以处置的变量:
source activate myenv