Странная вещь о.NET 4,0 функциональности перечисления файловой системы

Я просто прочитал страницу "Whats новая Платформа.NET 4.0". Я испытываю затруднения при понимании последнего абзаца:

Удалить открытые дескрипторы на перечислимых каталогах или файлах

  1. Создайте пользовательский метод (или функция в Visual Basic) для содержания кода перечисления.

  2. Примените атрибут MethodImplAttribute с опцией NoInlining к новому методу. Например:

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

  3. Включайте следующие вызовы метода, для погони за кодом перечисления:

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

Почему атрибут NoInlining? Какой вред встраивание причинило бы здесь?

Почему вызов сборщик "мусора" вручную, почему, не заставляя перечислитель реализовать IDisposable во-первых? Я подозреваю, что они используют FindFirstFile ()/FindNextFile () вызовы API реализации, таким образом, FindClose () нужно назвать в любом случае, если перечисление сделано.

Править:

У кого-либо есть идея, почему атрибут NoInlining предлагается в статье?

16
задан codymanix 2 June 2010 в 09:29
поделиться

1 ответ

Довольно странно. Итератор правильно реализует IDisposable, он вызывает FindClose (). Параметры AllDirectories могут быть источником проблем, поскольку FindFileFirst / Next позволяет выполнять итерацию только в одном каталоге. Но я вижу, что итератор делает правильные вещи, он держит открытым только один дескриптор при итерации структуры каталогов.

В статье MSDN специально упоминается, «если в одном из перечисленных каталогов или файлов остается открытый дескриптор». FindFileFirst / Next не оставляет дескриптор открытым. Но небрежный пользовательский код, который читает файлы при перечислении, делает это. «операция удаления файла или каталога» тоже актуальна, я думаю, что в Vista поведение изменилось. DeleteFile () может завершиться успешно, но на самом деле файл не исчезнет, ​​пока все дескрипторы файла не будут закрыты.

Нам нужен кто-то, кто бы добровольно не реализовал этот код в XP. Думаю, мы скоро кого-нибудь найдем :)

4
ответ дан 30 November 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: