DirectorySearcher循环中的内存泄漏

时间:2018-05-02 18:57:30

标签: c# directorysearcher

我在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
                        {

                        }
            }  

1 个答案:

答案 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