Я просто прочитал страницу "Whats новая Платформа.NET 4.0". Я испытываю затруднения при понимании последнего абзаца:
Удалить открытые дескрипторы на перечислимых каталогах или файлах
Создайте пользовательский метод (или функция в Visual Basic) для содержания кода перечисления.
Примените атрибут MethodImplAttribute с опцией NoInlining к новому методу. Например:
[MethodImplAttribute(MethodImplOptions.NoInlining)]
Private void Enumerate()
Включайте следующие вызовы метода, для погони за кодом перечисления:
* The GC.Collect() method (no parameters). * The GC.WaitForPendingFinalizers() method.
Почему атрибут NoInlining? Какой вред встраивание причинило бы здесь?
Почему вызов сборщик "мусора" вручную, почему, не заставляя перечислитель реализовать IDisposable во-первых? Я подозреваю, что они используют FindFirstFile ()/FindNextFile () вызовы API реализации, таким образом, FindClose () нужно назвать в любом случае, если перечисление сделано.
Править:
У кого-либо есть идея, почему атрибут NoInlining предлагается в статье?
Довольно странно. Итератор правильно реализует IDisposable, он вызывает FindClose (). Параметры AllDirectories могут быть источником проблем, поскольку FindFileFirst / Next позволяет выполнять итерацию только в одном каталоге. Но я вижу, что итератор делает правильные вещи, он держит открытым только один дескриптор при итерации структуры каталогов.
В статье MSDN специально упоминается, «если в одном из перечисленных каталогов или файлов остается открытый дескриптор». FindFileFirst / Next не оставляет дескриптор открытым. Но небрежный пользовательский код, который читает файлы при перечислении, делает это. «операция удаления файла или каталога» тоже актуальна, я думаю, что в Vista поведение изменилось. DeleteFile () может завершиться успешно, но на самом деле файл не исчезнет, пока все дескрипторы файла не будут закрыты.
Нам нужен кто-то, кто бы добровольно не реализовал этот код в XP. Думаю, мы скоро кого-нибудь найдем :)