如何在每1/10秒使用一次定时器时清除定时器

时间:2012-07-20 15:40:23

标签: c# .net visual-studio-2010 winapp

我有一个计时器每1/10秒运行一次(Interval = 100)。它处于infinte循环中,因为我希望在WebBrowser控件上加载一个站点,并在每次加载时将信息输入到span 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();
}

2 个答案:

答案 0 :(得分:4)

memoryleaks的一个可能来源是多个事件绑定。

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

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

我建议您.NET Memory Profiler 4.0解决问题。

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

答案 1 :(得分:0)

这是你应该在创建时间只做一次

    webBrowser.DocumentCompleted += webBrowser_DocumentCompleted;

这些可以删除。至少我认为他们没有任何目的,可能会有问题

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

如果我读了你的代码更正了timerLoad.Start();应该是一个Stop();当Tick加载文档然后应该停止工作,直到下一个按钮点击,对吧?