2017-02-23 48 views
1

为什么这个代码产生了这么多的内存使用,当你去在网页浏览器下一个页面(例如单击后退和前进,3分钟后,内存为300 MB),任何人都可以向我解释C#的foreach内存web浏览器

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     foreach (HtmlElement input in webBrowser1.Document.GetElementsByTagName("input")) 

     { 

      if (input.GetAttribute("type").ToLower() == "text") 
      { 
       input.GotFocus += null; 
       input.LostFocus += null; 
      } 


     } 

如何在这种情况下释放内存?相反,我想添加这个。

void GotFocusForm(object sender, EventArgs e) 
    { 
     Form2.Instance.Show(); 
    } 
    void LostFocusForm(object sender, EventArgs e) 
    { 
     Form2.Instance.Hide(); 
    } 

对于一个星期,我正在寻找一个解决方案。非常感谢您的帮助。

经过几次后退和前进。 Memory

+0

为什么使用'+ = null'? –

+1

我觉得你正在做的是'+ ='一堆,永远不会' - ='在这种情况下,事件堆积如山。 – MaLiN2223

+0

这是例如。空值已经增加了内存。我使用此代码而不是null。 input.GotFocus + = GotFocusForm; input.LostFocus + = LostFocusForm; – Matthew

回答

0

无论何时订阅事件,完成工作后,您需要取消订阅这些事件,否则会导致内存泄漏。底线是你需要取消订阅你订阅的每一个事件。

private void webBrowser1_DocumentEventCleanup() 
{ 
    foreach (HtmlElement input in webBrowser1.Document.GetElementsByTagName("input")) 
    { 
     if (input.GetAttribute("type").ToLower() == "text") 
     { //unsubscribe all the subscribe events 
      input.GotFocus -= null; 
      input.LostFocus -= null; 
     } 
    } 
}