Страницы

Поиск по вопросам

понедельник, 10 февраля 2020 г.

Как очистить IEnumerable

#c_sharp


Здравствуйте!

Подскажите как правильно очистить всю занятую память в IEnumerable

Собираю файлы с директории в другую папку, вначале проходит долго, после 2 запуска
файлы быстро появляются собранные из памяти.

Код:

 public static void Viscan(string ss, string[] Format, string z)
{
    long Limit = 100000000;
    long LowLimit = 0;
    IEnumerable findFiles = Directory.GetFiles(ss, "*.*", System.IO.SearchOption.AllDirectories);
    if (Directory.Exists(z))
        foreach (string fileName in findFiles)
        {
            string ext = Path.GetExtension(fileName).ToLower();
            if (Array.IndexOf(Format, ext) < 0) continue;
            try
            {
                var fileSize = new FileInfo(fileName).Length;
                if (LowLimit + fileSize > Limit) continue;
                File.Copy(fileName, Path.Combine(z, Path.GetFileName(fileName)), true);
                LowLimit += fileSize;
            }
            catch { }
        }
}

    


Ответы

Ответ 1



IEnumerable findFiles = Directory.GetFiles(ss, "*.*", System.IO.SearchOption.AllDirectories); Здесь вы определяете переменную ссылочного типа IEnumerable с именем findFiles, которая в результате присваивания ссылается на объект в куче, являющийся массивом строковых переменных. Данные хранятся в управляемой куче. Переменная объявлена внутри метода, следовательно, после того, как метод отработает, ссылки на объект в управляемой куче уже не будет. Поэтому после того, как CLR сама в нужный момент вызовет Garbage Collector (сборщик мусора), памать, выделенная под вашу переменную сама освободится.

Ответ 2



Вы имеете ввиду что первые два запуска файлы медленно копируются, а потом быстро? Если так, то тут имеет место быть работа менеджера памяти Windows, который просто держит часто используемые файлы отображенными в память, и следовательно фактически доступ к ним мгновенный. А по поводу очистки памяти занятой перечислимым типом, короткий ответ - прямым способом никак, т.к. всем этим занимается GC (garbage collector). Конечно можно им и руками порулить вызывая GC.Collect, но зачем? Дело то не в этом.

Комментариев нет:

Отправить комментарий