2010-04-18 4 views
15

Ich lese gerade eine Seite von "Whats new .NET Framework 4.0". Ich habe Mühe, den letzten Absatz zu verstehen:Seltsame Sache über .NET 4.0 Dateisystemaufzählung Funktionalität

Um offene Handles auf aufgezählt Verzeichnisse oder Dateien

  1. Erstellen Sie eine benutzerdefinierte Methode (oder Funktion in Visual Basic) zu entfernen Ihre Aufzählung Code zu enthalten.

  2. Wenden Sie das MethodImplAttribute-Attribut mit der NoInlining-Option auf die neue Methode an. Zum Beispiel:

    [MethodImplAttribute(MethodImplOptions.NoInlining)] Private void Enumerate()

  3. folgende Methodenaufrufe einschließen, nach der Aufzählung Code auszuführen:

    * The GC.Collect() method (no parameters). 
        * The GC.WaitForPendingFinalizers() method. 
    

Warum das Attribut NoInlining? Welchen Schaden würde Inlining hier anrichten?

Warum den Garbage Collector manuell aufrufen, warum sollte der Enumerator IDisposable nicht zuerst implementieren? Ich vermute, dass sie FindFirstFile()/FindNextFile() - API-Aufrufe für die Implementation verwenden, daher muss FindClose() in jedem Fall aufgerufen werden, wenn die Enumeration abgeschlossen ist.

EDIT:

Hat jemand eine Idee, warum das NoInlining Attribut in dem Artikel vorgeschlagen wird?

+4

Wow. Ich habe nicht erwartet, * das * in MSDN Beratung zu sehen ... –

+0

Ich bin überrascht, das zu sehen, aber beachten Sie die besonderen Umstände in dem Artikel beschrieben: "Wenn Sie Windows XP oder früher ausführen, ein Löschen Die Operation für eine Datei oder ein Verzeichnis, das einer Enumeration folgt, kann fehlschlagen, wenn ein geöffnetes Handle in einem der aufgelisteten Verzeichnisse oder Dateien vorhanden ist. Wenn dies der Fall ist, müssen Sie eine Garbage Collection auslösen, um die geöffneten Handles zu entfernen. –

+0

@Brian - wenn es nur für XP gilt, bin ich zufrieden ... ish. –

Antwort

4

Ziemlich bizarr. Der Iterator implementiert IDisposable korrekt und ruft FindClose() auf. Die AllDirectories-Optionen könnten eine Ursache für Probleme sein, da FindFileFirst/Next nur das Iterieren eines einzelnen Verzeichnisses erlaubt. Aber ich sehe, dass der Iterator das Richtige tut, er hält nur einen einzigen Punkt offen, während er die Verzeichnisstruktur iteriert.

Der MSDN-Artikel erwähnt speziell "ob es ein offenes Handle gibt, das auf einem der aufgezählten Verzeichnisse oder Dateien verbleibt". FindFileFirst/Next lässt kein Handle offen. Aber schlampiger Benutzercode, der Dateien beim Aufzählen liest. "Ein Löschvorgang für eine Datei oder ein Verzeichnis" ist ebenfalls relevant, ich denke, dass sich das Verhalten in Vista geändert hat. Eine DeleteFile() kann erfolgreich sein, aber die Datei wird nicht tatsächlich verschwinden, bis alle Punkte in der Datei geschlossen sind.

Wir brauchen jemanden zur Freiwilligenarbeit und nicht implementieren diesen Code auf XP. Ich denke, wir werden bald jemanden finden :)