0

我有一个每 1/10 秒运行一次的计时器(Interval = 100)。它处于无限循环中,因为我想在我的WebBrowser控件上加载一个站点并在每次加载时将信息获取到一个跨度 ID。我的问题是如果这个进程运行了很长时间,就会出现内存泄漏。

在 30 分钟内,内存使用量可以达到 800MB 或更多。如何防止我的程序在运行时不断使用更多内存?

这是相关的代码。它还不包括任何进程创建代码。

private void buttonBid_Click(object sender, EventArgs e)
{
    ID = Convert.ToInt32(textBoxID.Text);
    getItem();
    return;
}

private void getItem()
{
    webBrowser.Url = new Uri("http://www.test.com/?id=" + ID);
    webBrowser.DocumentCompleted += webBrowser_DocumentCompleted;
    return;
}

private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    timerLoad.Start();
    return;
}

private void timerLoad_Tick(object sender, EventArgs e)
{
    var elem = webBrowser.Document.GetElementById("product_" + ID);

    textBoxProduct.Text = Convert.ToString(elem.InnerText);

    timerLoad.Dispose();
    timerLoad.Start();
}
4

2 回答 2

4

内存泄漏的一个可能来源是多个事件绑定。

DocumentCompleted每次GetItem调用方法时都绑定事件。您应该绑定DocumentCompleted一次,例如在类的构造函数中。

但是,如果您只按下按钮一次,这将不是您的主要问题。

我想推荐.NET Memory Profiler 4.0来解决您的问题。

另外,我进一步搜索了一点,您的问题可能在于WebBrowser组件的使用:请参阅问题。

于 2012-07-20T15:42:33.627 回答
0

这是你应该在创建时只做一次的事情

    webBrowser.DocumentCompleted += webBrowser_DocumentCompleted;

这些可以删除。至少我认为它们没有任何作用,可能有问题

    timerLoad.Dispose();
    timerLoad.Start();

如果我阅读了您的代码,请更正 timerLoad.Start(); 应该是一个 Stop(); 随着 Tick 加载文档,然后应该停止工作,直到下一次单击按钮,对吗?

于 2012-07-20T15:49:30.940 回答