2017-11-28 12 views
3

MSDN 비고에 따르면 .Dispose()은 완료 후 System.DirectoryServices.SearchResultCollection에서 호출해야합니다.foreach-object 뒤에 SearchResultCollection을 삭제하십시오.

구현 제한 때문에 SearchResultCollection 클래스는 가비지 수집 될 때 모든 관리되지 않는 리소스를 해제 할 수 없습니다. 메모리 누수를 방지하려면 SearchResultCollection 개체가 더 이상 필요하지 않을 때 Dispose 메서드를 호출해야합니다..

은 또한 당신이 foreach이가 반복되기 전에 메모리에 저장되는 전체 SearchResultCollection 필요하기 때문에 Foreach-Object 대신 foreach 메모리를 절약하기 위해 사용해야 읽고있다.

$objSearcher.FindAll() | Foreach-Object { $_ } 

난 당신이 Foreach-Object를 사용하는 경우 어떻게 .Dispose()를 호출하는 것입니다 알아낼 수 없습니다 무엇
$objResults = $objSearcher.FindAll() 
foreach($objResult in $objResults) 
{ 
    $objResult 
} 

보다 낫다?

답변

4

foreach 유사한 문구가 있지만 언어 문은 ForEach-Object cmdlet과 동일하지 않습니다. (불행하게도, ForEach-Object는 IMO 단지 혼란에 추가 foreach의 기본 별명을 가지고 있습니다.)

나의 추천은 디렉토리 검색 결과를 반복 할 때 ForEach-Object 사용하지 않는 것입니다, DirectorySearcher이 효율적이고 ForEach-Object을 필요로하지 않기 때문에. (나는 또한 DirectorySearcher 긴 목록을 반환 할 수 있습니다로, 당신의 반복의 일환으로 Write-Progress을 권장합니다.) 당신이 PowerShell에서의 스트리밍 동작을 원하지하고 효율적인 검색이 없을 수도 있습니다 때

ForEach-Object 유용합니다.

0

Bill Stewart가 맞습니다. .FindAll()IEnumerable을 반환하므로 어떤 것을 선택하든 상관 없습니다.

$objResults = $objSearcher.FindAll() 
$objResults | Foreach-Object { $_ } 
$objResults.Dispose() 
+0

이 있습니까 : 위의 때문에, 당신은 변수 처음에 저장할 수 있습니다

그러나 ForEach-Object와 객체의 방법 Dispose의 질문에

는 그냥 파이프 다음, 당신이 foreach했던 좋아 'foreach ($ obj in $ objResults) '를 통해이 작업을 수행하면 어떤 이점이 있습니까? – IMTheNachoMan

+1

"이 작업을 수행 할 때 어떤 이점이 있습니까?" 아니 정말. –

+1

@IMTheNachoMan 빌이 말했듯이, 그렇지 않습니다. 다루는 객체는 열거자가 아니며 미리 생성 된 컬렉션이 아니기 때문에 별 문제가되지 않습니다. 응용 분야에 가장 적합한 것을 사용하십시오. 나는 당신이 이것을 선택한 경우'.Dispose()'를 실행하는 방법을 시연하고있었습니다 (당신의 질문이 제시 한대로). – briantist