2010-08-01 2 views
3

Я использую WebClient, DownloadString («http://example.com/string.txt»); Когда я это называю, память вскакивает вверх, но никогда не опускается снова, и поскольку мне нужно 2-3 разных строки, загружаемых из Интернета, память очень сильно подпрыгивает.C# Использование памяти WebClient

Я новичок в C# и все еще учась, но все равно, чтобы очистить память после того, как я загрузил строку из Интернета? Если нет, знаете ли вы какие-либо другие методы, которые я могу использовать для чтения из Интернета, использующего меньше памяти?

Благодаря

+0

Нет, не беспокойтесь. Способ работы сборщика мусора (для .NET и в других местах) заключается в том, что память не * немедленно * освобождена. Что вызывает очистку - это давление в памяти. –

+0

Пока вы не держите ссылки на мертвые объекты (и вы правильно распоряжаетесь теми, которые являются «IDisposable»), вы можете рассчитывать на GC, чтобы в конечном итоге очистить вещи. Но если вы хотите убедиться сами, вы можете проверить его, вставив вызов в «GC.Collect» (http://msdn.microsoft.com/en-us/library/system.gc.collect.aspx). Это просто увидеть: вы почти никогда не хотите делать это в реальном коде. –

ответ

8

WebClient реализует IDisposable, так что ваш код должен выглядеть следующим образом:

string result; 
using (WebClient client = new WebClient()) 
{ 
    result = client.DownloadString("http://example.com/string.txt"); 
} 
Console.WriteLine(result); 

Это позволит убедиться, что большинство ресурсов, используемых экземпляром WebClient высвобождаются.

Остальное в конечном итоге будет очищено сборщиком мусора. Тебе не нужно беспокоиться об этом.

+1

Ну, в этом случае я сомневаюсь, что это что-то изменит, поскольку возвращаемая строка из 'DownloadString' не является точно неуправляемым ресурсом, который будет освобожден на' Dispose() '. Хороший общий совет всегда включать 'IDisposable' в' using'. – Joey

+1

@Johannes Rössel: Это не возвращаемое значение, которое выбрано WebClient, но внутренние объекты, которые его используют, например объекты HttpWebRequest/HttpWebResponse. Существует причина, по которой WebClient реализует IDisposable, потому что, если этого не произошло, он не будет реализовывать его. – dtb

+0

Как я новичок в C#, вы можете объяснить эту вещь? – PixL

3

«Использование памяти», отображаемое такими инструментами, как Taskmgr.exe или ProcExp.exe, говорит вам приседать о фактической памяти, используемой программой. Когда виртуальная память освобождается сборщиком мусора, свободное пространство почти никогда не возвращается в операционную систему. Он добавляется в список свободных блоков, готовых к повторному использованию при следующем распределении. Шансы, что свободные блоки сливаются обратно на ряд страниц, которые могут быть освобождены, довольно малы.

Это никогда не является реальной проблемой, это virtual памяти. Другой способ заставить вас чувствовать себя хорошо быстро - это свести к минимуму главное окно программы. Это обрезает рабочий набор, объем используемой ОЗУ.

Смежные вопросы