2010-04-18 10 views
15

Właśnie przeczytałem stronę "Whats new .NET Framework 4.0". Mam kłopoty ze zrozumieniem ostatni akapit:Dziwna rzecz dotycząca funkcji wyliczania systemu plików .NET 4.0

Aby usunąć otwarte uchwyty na wymienionych katalogów lub plików

  1. Utwórz niestandardową metodę (lub funkcja w języku Visual Basic) powstrzymywanie kod wyliczenia.

  2. Zastosuj atrybut MethodImplAttribute z opcją NoInlining dla nowej metody. Na przykład:

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

  3. Dołącz następujące wywołania metod, aby uruchomić po kodzie wyliczenie :

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

dlaczego atrybutu NoInlining? Jaką szkodę wprowadziłbyś tutaj?

Po co ręcznie wywoływać moduł do zbierania śmieci, dlaczego w pierwszej kolejności nie należy implementować modułu wyszukującego IDisposable? Podejrzewam, że używają wywołań API FindFirstFile()/FindNextFile() do implementacji, więc FindClose() musi być wywołana w każdym przypadku, jeśli wyliczenie jest zrobione.

EDIT:

Czy ktoś ma pomysł dlaczego atrybut NoInlining jest sugerowane w artykule?

+4

Wow. Nie spodziewałem się, że * to * w opinii MSDN ... –

+0

Jestem także zaskoczony, że to widzę, ale zwróć uwagę na specjalne okoliczności opisane w artykule: "Jeśli korzystasz z systemu Windows XP lub wcześniejszego, usuń operacja na pliku lub katalogu, który następuje po wyliczeniu, może zakończyć się niepowodzeniem, jeśli istnieje otwarty uchwyt, który pozostaje w jednym z wyliczonych katalogów lub plików .Jeśli tak się stanie, musisz wywołać kolekcję śmieci, aby usunąć otwarte uchwyty. " –

+0

@Brian - jeśli dotyczy tylko XP, jestem zadowolony z ... ish. –

Odpowiedz

4

Całkiem dziwaczne. Iterator poprawnie implementuje IDisposable, wywołuje FindClose(). Opcje AllDirectories mogą być źródłem problemów, ponieważ FindFileFirst/Next pozwala tylko na iterację pojedynczego katalogu. Ale widzę, że iterator robi to, co trzeba, tylko otwiera jeden uchwyt podczas iterowania struktury katalogów.

Artykuł MSDN wymienia "jeśli jest otwarty uchwyt, który pozostaje na jednym z wyliczonych katalogów lub plików". FindFileFirst/Next nie pozostawi otwartego uchwytu. Ale niechlujny kod użytkownika, który czyta pliki podczas ich wyliczania. "operacja usuwania na pliku lub katalogu" jest również istotna, uważam, że zachowanie zmieniło się w Vista. Funkcja DeleteFile() może się powieść, ale plik nie zniknie, dopóki wszystkie uchwyty w pliku nie zostaną zamknięte.

Potrzebujemy kogoś, aby zgłosić się jako ochotnik, a nie zaimplementować tego kodu na XP. Sądzę, że wkrótce znajdziemy kogoś :)