【问题标题】:C# WebClient Memory UsageC# WebClient 内存使用
【发布时间】:2010-08-01 18:11:25
【问题描述】:

我正在使用 WebClient,DownloadString("http://example.com/string.txt"); 当我调用它时,内存会上升,但再也不会下降,因为我需要从网上下载 2-3 个不同的字符串,所以内存会上升很多。

我是 C# 的新手,还在学习,但是在我从网上下载字符串后,是否有清除内存的方法? 如果没有,您知道我可以使用哪些其他方法从 Web 读取占用更少的内存吗?

谢谢

【问题讨论】:

  • 不,别担心。垃圾收集的工作方式(对于 .NET 和其他地方)是内存不会立即释放。导致清理的原因是内存压力。
  • 只要你没有持有对死对象的引用(并且你正确地处理了那些IDisposable),你就可以依靠 GC 最终清理它们。但是如果你想亲自看看,你可以通过插入对GC.Collectmsdn.microsoft.com/en-us/library/system.gc.collect.aspx)的调用来测试它。这只是为了看看:你几乎不想在实际代码中这样做。

标签: c# memory webclient


【解决方案1】:

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 中。
  • @Johannes Rössel:WebClient 处理的不是返回值,而是它使用的内部对象,例如 HttpWebRequest/HttpWebResponse 对象。 WebClient 实现 IDisposable 是有原因的,因为如果没有,它就不会实现它。
  • 我是 C# 新手,你能解释一下 IDisposable 这个东西吗?
  • WebClient 不会覆盖组件类中的 Dispose() 方法。 using-pattern 是对的,但并不能解决内存泄漏问题。
【解决方案2】:

Taskmgr.exe 或 ProcExp.exe 等工具显示的“内存使用情况”告诉您了解程序实际使用的内存。当垃圾收集器释放虚拟内存时,空闲空间几乎永远不会返回给操作系统。它被添加到空闲块列表中,以供下一次分配重用。空闲块合并成一系列可以被释放的页面的几率非常小。

这从来都不是真正的问题,这是虚拟内存。另一种让您快速感觉良好的方法是最小化程序的主窗口。这会修剪工作集,即正在使用的 RAM 量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-18
    • 2011-05-27
    • 2014-06-02
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    相关资源
    最近更新 更多