2010-04-18 9 views
15

Ho appena letto una pagina di "Whats new .NET Framework 4.0". Ho difficoltà a capire l'ultimo paragrafo:Strana cosa sulla funzionalità di enumerazione del filesystem .NET 4.0

Per rimuovere handle aperti sulla directory o file

  1. Creare un metodo personalizzato (o funzione in Visual Basic) per contenere il codice di enumerazione enumerati.

  2. Applicare l'attributo MethodImplAttribute con l'opzione NoInlining al nuovo metodo. Per esempio:

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

  3. Includere le seguenti chiamate di metodo, a rincorrere il proprio codice di enumerazione :

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

Perché l'attributo NoInlining? Che male farebbe l'inline qui?

Perché chiamare il garbage collector manualmente, perché non rendere l'idificatore implementare IDisposable in primo luogo? Sospetto che utilizzino le chiamate API FindFirstFile()/FindNextFile() per l'implementazione, quindi è necessario chiamare FindClose() in ogni caso se l'enumerazione è stata eseguita.

EDIT:

Qualcuno ha un idea del perché l'attributo NoInlining viene suggerito in questo articolo?

+4

Wow. Non mi aspettavo di vedere * that * in MSDN advice ... –

+0

Sono sorpreso di vedere anche questo, ma prendi nota delle circostanze speciali descritte nell'articolo: "Se stai usando Windows XP o precedente, una cancellazione l'operazione su un file o una directory che segue un'enumerazione potrebbe non riuscire se è presente un'handle aperta che rimane su una delle directory o dei file elencati. Se ciò si verifica, è necessario indurre una garbage collection per rimuovere gli handle aperti. " –

+0

@Brian - se si applica solo a XP sono contento ... ish. –

risposta

4

Abbastanza bizzarro. L'iteratore implementa correttamente IDisposable, chiama FindClose(). Le opzioni AllDirectories possono essere fonte di problemi poiché FindFileFirst/Next consente solo di iterare una singola directory. Ma sto vedendo l'iteratore fare la cosa giusta, mantiene solo un unico handle aperto mentre itera la struttura della directory.

L'articolo MSDN menziona in modo specifico "se esiste un handle aperto che rimane su una delle directory o dei file enumerati". FindFileFirst/Next non lascerà un handle aperto. Ma il codice utente sciatto che legge i file durante l'enumerazione. "Un'operazione di cancellazione su un file o una directory" è anch'essa rilevante, penso che il comportamento sia cambiato in Vista. Un DeleteFile() può avere successo ma il file non scomparirà fino a quando non verranno chiusi tutti gli handle del file.

Abbiamo bisogno di qualcuno per fare volontariato e non implementare questo codice su XP. Penso che troveremo qualcuno presto :)