Wie kann ich PowerShell anweisen, .NET-Objekte wie XmlSchemaSet als Garbage zu sammeln?

Ich habe ein PowerShell-Skript erstellt, das eine große Anzahl von XML-Schema-Dateien (.xsd) durchläuft und für jede ein .NET erstelltXmlSchemaSet Objekt, ruftAdd() undCompile() um ein Schema hinzuzufügen und alle Validierungsfehler auszudrucken.

Dieses Skript funktioniert ordnungsgemäß, aber irgendwo ist ein Speicherverlust aufgetreten, der dazu führt, dass es Gigabyte an Speicher belegt, wenn es mit 100 Dateien ausgeführt wird.

Was ich im Wesentlichen in einer Schleife mache, ist das Folgende:

$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()

(Ein vollständiges Skript, um dieses Problem zu reproduzieren, finden Sie in der folgenden Übersicht:https://gist.github.com/3002649. Führen Sie es einfach aus und beobachten Sie, wie die Speichernutzung im Task-Manager oder im Prozess-Explorer zunimmt.)

Inspiriert von einigen Blog-Posts habe ich versucht, etwas hinzuzufügen

remove-variable reader, schemaSet

Ich habe auch versucht, das aufzuheben$schema vonAdd() und zu tun

[void] $schemaSet.RemoveRecursive($schema)

Diese scheinen eine gewisse Wirkung zu haben, aber es gibt immer noch ein Leck. Ich gehe davon aus, dass ältere Fälle vonXmlSchemaSet verwenden immer noch Speicher, ohne dass Müll gesammelt wird.

Die Frage: Wie kann ich dem Garbage Collector richtig beibringen, dass er den gesamten im obigen Code verwendeten Speicher wiederherstellen kann? Oder allgemeiner: Wie kann ich mein Ziel mit einem begrenzten Speicher erreichen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage