#c_sharp
Здравствуйте! Подскажите как правильно очистить всю занятую память в IEnumerable Собираю файлы с директории в другую папку, вначале проходит долго, после 2 запуска файлы быстро появляются собранные из памяти. Код: public static void Viscan(string ss, string[] Format, string z) { long Limit = 100000000; long LowLimit = 0; IEnumerablefindFiles = 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
IEnumerablefindFiles = Directory.GetFiles(ss, "*.*", System.IO.SearchOption.AllDirectories); Здесь вы определяете переменную ссылочного типа IEnumerable с именем findFiles, которая в результате присваивания ссылается на объект в куче, являющийся массивом строковых переменных. Данные хранятся в управляемой куче. Переменная объявлена внутри метода, следовательно, после того, как метод отработает, ссылки на объект в управляемой куче уже не будет. Поэтому после того, как CLR сама в нужный момент вызовет Garbage Collector (сборщик мусора), памать, выделенная под вашу переменную сама освободится. Ответ 2
Вы имеете ввиду что первые два запуска файлы медленно копируются, а потом быстро? Если так, то тут имеет место быть работа менеджера памяти Windows, который просто держит часто используемые файлы отображенными в память, и следовательно фактически доступ к ним мгновенный. А по поводу очистки памяти занятой перечислимым типом, короткий ответ - прямым способом никак, т.к. всем этим занимается GC (garbage collector). Конечно можно им и руками порулить вызывая GC.Collect, но зачем? Дело то не в этом.
Комментариев нет:
Отправить комментарий