我正在使用WebClient,DownloadString(「http://example.com/string.txt」); 當我調用它時,內存跳轉了,但再也沒有下去了,因爲我需要從網上下載2-3個不同的字符串,所以內存跳轉得非常多。C#Web客戶端內存使用
我是C#的新手,仍然在學習,但無論如何清理內存後,我已經從網上下載字符串? 如果沒有,您是否知道我可以使用從網絡讀取的其他任何方法來使用更少的內存?
感謝
我正在使用WebClient,DownloadString(「http://example.com/string.txt」); 當我調用它時,內存跳轉了,但再也沒有下去了,因爲我需要從網上下載2-3個不同的字符串,所以內存跳轉得非常多。C#Web客戶端內存使用
我是C#的新手,仍然在學習,但無論如何清理內存後,我已經從網上下載字符串? 如果沒有,您是否知道我可以使用從網絡讀取的其他任何方法來使用更少的內存?
感謝
WebClient實現IDisposable,所以你的代碼應該是這樣的:
string result;
using (WebClient client = new WebClient())
{
result = client.DownloadString("http://example.com/string.txt");
}
Console.WriteLine(result);
這將確保通過WebClient的實例中使用的大多數資源將被釋放。
其餘部分最終將由垃圾收集器清理。你不需要擔心這個。
那麼,在這種情況下,我懷疑它會改變什麼,因爲從'DownloadString'返回的字符串不完全是一個非託管資源,它將在'Dispose()'上被釋放。不過,一般的建議總是把'IDisposable'封裝在'using'中。 – Joey 2010-08-01 18:40:56
@JohannesRössel:它不是WebClient處理的返回值,而是它使用的內部對象,例如HttpWebRequest/HttpWebResponse對象。 WebClient實現IDisposable是有原因的,因爲如果沒有,它不會實現它。 – dtb 2010-08-01 18:49:13
因爲我是C#的新手,你能解釋一下這個IDisposable的東西嗎? – PixL 2010-08-01 23:47:29
像「Taskmgr.exe」或「ProcExp.exe」這樣的工具所顯示的「內存使用情況」告訴您,程序正在使用實際內存。當垃圾收集器釋放虛擬內存時,可用空間幾乎不會返回到操作系統。它被添加到空閒塊列表中,準備好在下一次分配時重新使用。空閒塊合併回一系列可以釋放的頁面的可能性非常小。
這永遠不是一個真正的問題,這是虛擬內存。另一種快速讓你感覺良好的方法是儘量減少程序的主窗口。這修剪了工作集,即正在使用的RAM數量。
不,別擔心。垃圾收集的工作方式(對於.NET和其他地方)是內存不會立即被釋放。導致清理的原因是內存壓力。 – 2010-08-01 18:13:40
只要你沒有對死對象的引用(並且你正在處理那些'IDisposable'),你可以指望GC最終清理乾淨。但是如果你想自己看,你可以通過調用'GC.Collect'(http://msdn.microsoft.com/en-us/library/system.gc.collect.aspx)來測試它。這只是爲了看到:你幾乎從不想在真正的代碼中做到這一點。 – 2010-08-01 18:15:13