为什么这段代码消耗的内存越来越多?

Jua*_*uan 2 .net c#

public partial class Form1 : Form
{
    bool AfterDocumentCompleted = false;
    int steps = 0;

    public Form1()
    {
        InitializeComponent();
        webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(DocCompletedHandlerCopy);
        webBrowser1.ScriptErrorsSuppressed = true;
    }

    private void DocCompletedHandlerCopy(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        if (webBrowser1.ReadyState == WebBrowserReadyState.Complete && e.Url == webBrowser1.Url)
        {
            AfterDocumentCompleted = true;
        }
    }

    private void NavigateAndWait(string urlString)
    {
        AfterDocumentCompleted = false;
        webBrowser1.Navigate(urlString);
        while (AfterDocumentCompleted == false) Application.DoEvents();

        steps += 1;
        label1.Text = string.Format("{0:00000} / {1}MB", steps, Environment.WorkingSet / (1024 * 1024));
    }

    private void button1_Click(object sender, EventArgs e)
    {
        while (true)
        {
            NavigateAndWait("http://www.crucial.com/");
            NavigateAndWait("http://www.google.com/");
            NavigateAndWait("http://www.microsoft.com/");
            NavigateAndWait("http://www.stackoverflow.com/");
            NavigateAndWait("http://www.yahoo.com/");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我单击Button1(所以它调用button1_Click)并等待大约1小时时,根据任务管理器消耗的RAM label1大约为1000MB(一旦点击它就大约20MB,并且增长率有点线性).WebBrowser是某种浏览器的alpha版本,任何人都不应该使用它,或者我做错了什么.如果你想知道为什么在世界上做我想做的导航永远对这些网页,这是我有一个问题,只是隔离(见我的其他问题在这里).

编辑:大约一周前我安装并卸载了IE9测试版.我认为这可能是问题的根源.刚刚在Windows Vista IE8上进行了测试,它的增长不超过80-90MB.我将重新安装Windows,我希望我不需要降级到Windows Vista.

Edit2:我终于找到了问题的原因.它不是IE9测试版.事实是我设置IE不显示任何图片.我认为不显示图片会使导航更快更轻,但显然它激活了一些bug并且消耗的内存开始像疯了一样增长.不过,随着图片,内存增长但速度慢得多.

Hen*_*man 7

等待大约10分钟,根据任务管理器消耗的内存大约是200MB

  • 200 MB并不是很多
  • TaskManager不适合测量内存使用

您通过控件使用的WebBrowser是IE.它将消耗相当多的内存,主要用于缓存内容.但你真的没有内存问题.

额外:

我运行你的应用程序并只改变了这个方法(添加Label1):

    int counter = 0;

    private void NavigateAndWait(string urlString)
    {
        AfterDocumentCompleted = false;
        webBrowser1.Navigate(urlString);
        while (AfterDocumentCompleted == false) Application.DoEvents();

        counter += 1;
        label1.Text = string.Format("{0:000} {1}", counter, 
           Environment.WorkingSet/ (1024*1024));
    }
Run Code Online (Sandbox Code Playgroud)

当我让它运行一段时间内存稳定在75-85 MB范围内.

在评论中你提到1.6 GB,这是一个问题.但这不是这个代码.所以你有一个开始:寻找差异.

编辑2

升级您的IE版本.我用Vista/32和IE8运行它,而WorkingSet不会超过90MB.(600页)