2010-08-01 6 views
3

WebClient를 사용하고 있습니다. DownloadString ("http://example.com/string.txt"); 내가 메모리라고 부르면 메모리는 올라가지 만 다시는 내려 가지 않는다. 그리고 웹에서 다운로드 한 2-3 개의 다른 문자열이 필요하기 때문에 메모리가 상당히 많이 올라간다.C# WebClient 메모리 사용량

저는 C#을 처음 사용하면서도 배우기는했지만 어쨌든 웹에서 문자열을 다운로드 한 후에 메모리를 지울 수 있습니까? 그렇지 않다면 메모리를 적게 사용하는 웹에서 읽을 수있는 다른 방법을 알고 계십니까?

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

이것은 웹 클라이언트 인스턴스에서 사용하는 대부분의 자원이 해제되어 있는지 확인합니다 : 코드는 다음과 같이해야하므로

감사

+0

아니요, 걱정하지 마십시오. 가비지 수집이 작동하는 방식 (.NET 및 다른 곳에서)은 메모리가 즉시 해제되지 않는다는 것입니다. 클린업의 원인은 메모리 부족입니다. –

+0

죽은 객체에 대한 참조를 보유하지 않는 한 (그리고 IDisposable 인 객체를 적절하게 처분하는 경우) GC를 사용하면 결과적으로 정리할 수 있습니다. 그러나 직접보고 싶다면'GC.Collect' (http://msdn.microsoft.com/en-us/library/system.gc.collect.aspx)를 호출하여 테스트 할 수 있습니다. 그것은 단지보아야합니다. 실제 코드에서는 그렇게하기를 거의 원하지 않습니다. –

답변

8

WebClientIDisposable 구현합니다.

나머지는 결국 가비지 수집기로 정리됩니다. 당신은 이것에 대해 걱정할 필요가 없습니다.

+1

글쎄,이 경우에는'DownloadString'에서 반환 된 문자열이'Dispose()'에서 해제 될 관리되지 않는 리소스가 아니므로, 아무것도 변경하지 않을지 의심 스럽습니다. 그래도 항상'IDisposable'을'using'으로 감싸는 것이 좋습니다. – Joey

+1

@Johannes Rössel : WebClient에 의해 처리되는 반환 값이 아니라 HttpWebRequest/HttpWebResponse 개체와 같이 WebClient에서 사용하는 내부 개체입니다. WebClient가 IDisposable을 구현하는 데는 이유가 있습니다. 그렇지 않은 경우 구현하지 않기 때문입니다. – dtb

+0

C#을 처음 접했을 때이 IDisposable 것을 설명 할 수 있습니까? – PixL

3

Taskmgr.exe 또는 ProcExp.exe와 같은 도구에서 표시되는 "메모리 사용"은 프로그램에서 사용중인 실제 메모리를 쪼갤 수 있음을 알려줍니다. 가상 메모리가 가비지 수집기에 의해 해제되면 여유 공간이 거의 운영 체제로 반환되지 않습니다. 빈 블록 목록에 추가되며 다음 할당시 재사용 할 준비가됩니다. 자유 블록이 풀어 낼 수있는 페이지의 범위로 다시 합칠 확률은 아주 적습니다.

이것은 실제 문제가 아닙니다. 가상 메모리입니다. 좋은 느낌을 빨리 느끼게하는 또 다른 방법은 프로그램의 기본 창을 최소화하는 것입니다. 이는 작업 세트, 사용중인 RAM의 양을 줄입니다.