Как настроить PowerShell для сбора мусора .NET-объектов, таких как XmlSchemaSet?

Я создал скрипт PowerShell, который перебирает большое количество файлов XML Schema (.xsd), и для каждого из них создается .NETXmlSchemaSet объект, звонкиAdd() а такжеCompile() добавить схему и распечатать все ошибки проверки.

Этот скрипт работает правильно, но где-то происходит утечка памяти, из-за чего он потребляет гигабайты памяти, если выполняется на сотнях файлов.

Что я по сути делаю в цикле, так это следующее:

$schemaSet = new-object -typename System.Xml.Schema.XmlSchemaSet
register-objectevent $schemaSet ValidationEventHandler -Action {
    ...write-host the event details...
}
$reader = [System.Xml.XmlReader]::Create($schemaFileName)
[void] $schemaSet.Add($null_for_dotnet_string, $reader)
$reader.Close()
$schemaSet.Compile()

(Полный сценарий для воспроизведения этой проблемы можно найти в этой сущности:https://gist.github.com/3002649, Просто запустите его и наблюдайте за увеличением использования памяти в диспетчере задач или в Process Explorer.)

Вдохновленный некоторыми сообщениями в блоге, я попытался добавить

remove-variable reader, schemaSet

Я также попытался подобрать$schema отAdd() и делать

[void] $schemaSet.RemoveRecursive($schema)

Похоже, они имеют некоторый эффект, но все же есть утечка. Я предполагаю, что более старые случаиXmlSchemaSet все еще используют память без сбора мусора.

The question: Как правильно научить сборщик мусора, чтобы он мог вернуть всю память, использованную в коде выше? Или в более общем плане: как мне достичь своей цели с ограниченным объемом памяти?

Ответы на вопрос(2)

Ваш ответ на вопрос