2012-03-27 7 views
1

Der folgende Code, führte in einem Windows-Formular, schafft ein WebBrowser-Steuerelement und navigiert zu einer Reihe von URLs. Jedes Mal, wenn eine URL navigiert wird, nimmt der von der Anwendung belegte Speicher zu und scheint nie freigegeben zu werden. In meinem Fall steigt die Speicherbelegung von ~ 10 Mb auf ~ 45 Mb mit nur 4 Dokumenten. Ich muss mehrere hundert Dokumente durchsuchen, wodurch schnell der gesamte physische Speicher verwendet wird.Wie Speicher freizugeben, während Web-Dokumente navigieren eine Windows.Forms.WebBrowser Steuer

Wie löse ich die von dem WebBrowser-Steuerelement verwendeten Ressourcen?

private void ProcessDocs() 
    { 
     Random rnd = new Random(); 
     DateTime dtWaitUntil = DateTime.Now; 
     string[] arrInputUrl = new string[] { "http://www.google.co.uk/", "http://www.google.com/", "http://www.yahoo.com/", "http://www.amazon.co.uk/" }; 

     for (int i = 0; i < arrInputUrl.Length; i++) 
     { 
      using (WebBrowser objWebBrowser = new WebBrowser()) 
      { 
       string txtInputUrl = arrInputUrl[i]; 
       tboxTestingOutput.Text += "\r\n" + txtInputUrl; 

       objWebBrowser.ScriptErrorsSuppressed = true; 
       objWebBrowser.Navigate(txtInputUrl); 

       //Should do this a better way, but, wait 10 secs for document to complete. 
       //Would use objWebBrowser.DocumentCompleted event 
       //but it seems to fire several times per document load!!! 
       dtWaitUntil = DateTime.Now.AddSeconds(10); 

       do 
       { 
        Application.DoEvents(); 
       } while (DateTime.Now < dtWaitUntil); 

       //Do whatever I need to with the document contents 
       //... 
       //... 
      } 
     } 

     tboxTestingOutput.Text += "\r\nFinished"; 
    } 
+0

Wenn Sie nur die Web-Seiten zu lesen, müssen Inhalt Halten Sie mit 'WebRequest' statt? (Siehe http://msdn.microsoft.com/en-us/library/system.net.webrequest.aspx) – MiMo

+0

Nun, wir wissen, dass es 45 MB verbrauchen, das ist Erdnüsse für einen Browser. Was wir nicht wissen ist, wie viel VM es verbraucht, wenn es abstürzt. Hast du eigentlich lange genug gewartet oder glaubst du nur, dass es einfach weitergeht? So funktioniert der Speichermanager nicht. –

+0

@MiMo ich WebBrowser verwenden, um die letzte Seite umgeleiteter zu navigieren, die das Ergebnis von HTTP-Header sein kann, Umleitungen, Javascript umleitet, SWF Umleitungen, usw., von denen viele nicht von WebRequest behandelt. – Steven

Antwort

0

Obwohl ich es nicht vollständig empfehlen würde, P/Invoke SetProcessWorkingSetSize mit -1 sollte eine leere des Prozesses erzwingen Arbeitssatz, zum Beispiel:

[DllImport("kernel32.dll")] 
static extern bool SetProcessWorkingSetSize(IntPtr handle, int minSize, int maxSize); 

SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle,-1,-1); 

Lesen Sie mehr hier:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686234(v=vs.85).aspx

Verwandte Themen