我有一个计时器每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();
}
答案 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加载文档然后应该停止工作,直到下一个按钮点击,对吧?