根据MSDN评论,.Dispose()
必须在System.DirectoryServices.SearchResultCollection
完成后调用。
由于实施限制,SearchResultCollection类在垃圾回收时无法释放所有非托管资源。 为防止内存泄漏,必须在不再需要SearchResultCollection对象时调用Dispose方法。
我还读到你应该使用Foreach-Object
代替foreach
来节省内存,因为foreach
要求将整个SearchResultCollection
保存到内存中才能进行迭代上。
$objSearcher.FindAll() | Foreach-Object { $_ }
优于
$objResults = $objSearcher.FindAll()
foreach($objResult in $objResults)
{
$objResult
}
如果您使用.Dispose()
,我无法弄清楚如何致电Foreach-Object
?
答案 0 :(得分:4)
foreach
语言语句不等同于ForEach-Object
cmdlet,尽管它们具有相似的用途。 (不幸的是,ForEach-Object
的默认别名为foreach
,IMO只会增加混淆。)
我建议在迭代目录搜索结果时不要使用ForEach-Object
,因为DirectorySearcher
是有效的,不需要ForEach-Object
。 (我还建议Write-Progress
作为迭代的一部分,因为DirectorySearcher
可能会返回一个长列表。)
ForEach-Object
非常有用,而您可能无法进行有效的搜索。
答案 1 :(得分:0)
mySql
会返回.FindAll()
,因此您选择哪一个并不重要。
但是关于如何IEnumerable
使用Dispose
的对象的问题,由于上述原因,您可以先将其存储在变量中,就像使用ForEach-Object
一样,然后管道:
foreach