C# WebClient 内存使用

3
我正在使用WebClient,DownloadString("http://example.com/string.txt")。当我调用它时,内存会上升,但从未再次下降,因为我需要从网络下载2-3个不同的字符串,所以内存上升相当多。
我是C#的新手,仍在学习中,但是否有任何方法可以在我从网络下载字符串后清除内存?如果没有,您知道我可以使用哪些其他方法来从网络读取并使用更少的内存吗?
谢谢。

不用担心。垃圾回收的工作方式(对于.NET和其他语言)是内存不会立即释放。引起清理的原因是内存压力。 - Steven Sudit
只要你没有持有死对象的引用(同时你也正确处理了 IDisposable 的对象),你可以依赖于垃圾回收最终清除它们。但如果你想亲自验证,你可以插入一个调用 GC.Collect(http://msdn.microsoft.com/en-us/library/system.gc.collect.aspx)。那只是为了测试:你几乎从不想在真实代码中这样做。 - Steven Sudit
2个回答

9

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
由于我刚接触C#,你能解释一下这个IDisposable是什么吗? - PixL
1
WebClient类没有覆盖Component类的Dispose()方法。使用using模式是正确的,但无法解决内存泄漏问题。 - TcKs

3
"内存使用情况",如Taskmgr.exe或ProcExp.exe等工具所显示的内容,对于程序实际使用的内存并没有太多帮助。当垃圾回收器释放虚拟内存时,空闲空间几乎从不返回给操作系统。它被添加到一个空闲块列表中,以便下一次分配重新使用。这些空闲块重新合并成可以释放的页面范围的可能性非常小。
这从来不是真正的问题,这是虚拟内存。快速让您感觉良好的另一种方法是最小化程序的主窗口。这会减少正在使用的RAM量,也就是工作集。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接