使用System.DirectoryServices.Protocols
库:
我有一个类LdapItemOperator
,它从LDAP查询(不与Active Directory相关)中获取SearchResultEntry
对象,并将该对象的属性存储在一个字段中:readonly SearchResultAttributeCollection LdapAttributes
。
我遇到的问题是,当我有一个大的操作时,垃圾收集器似乎永远不会删除这些对象因为我的对象中的LdapAttributes
字段,它们应该已经被处理,至少我认为这是问题所在。当不再需要这些物品时,我可以尝试用什么方法来处理它们?我似乎找不到一种方法来合并using
语句在那里,虽然我只有很少的经验。
例如,假设我有以下逻辑:
List<LdapItemOperator> itemList = GetList(ldapFilter);
List<bool> resultList = new List<bool>();
foreach (IdmLdapItemOperator item in itemList) {
bool result = doStuff(item);
resultList.Add(result);
}
//Even though we are out of the loop now, the objects are still stored in memory, how come? Same goes for the previous objects in the loop, they seem to remain in memory
Logic.WriteResultToLog(result);
在大文件集上运行逻辑一段时间后,这个进程开始占用大量的内存,当然…
我想你可能对GC的工作原理有点困惑。您永远无法确切地知道GC将在何时运行。并且仍然持有引用的对象将不会被收集(除非它是弱引用…)。
也"disposing"是另一个不同的概念,它与GC关系不大。
基本上,在调用GetList
之后,所有对象都将在内存中已经。在此之后,内存消耗不会有太大变化,foreach循环根本不应该影响它。
在不了解你的实现的情况下,也许可以尝试返回一个可枚举的而不是单个列表,或者进行多个批量调用。