none
Por quê WebBrowser não se descarrega da memória? RRS feed

  • Pergunta

  • Ao utilizar um WebBrowser em uma aplicaçao WindowsForm, o programa visita várias páginas mas sempre acumula memória ao ponto de parar a aplicação por falta de memória suficiente para executar a ação.

    O que eu faço é:

    For Each Url As String In ListBox1.Items Dim Web As New WebBrowser Panel1.Controls.Add(Web) With web .Navigate(Url) While not .readyState = WebBrowserReadyState.Complete Application.doEvents() end while end with .Dispose()
    Panel1.Controls.Remove(Web) Next

    O problema é que deveria, pela lógica, o controle Web ser descartado da memória mas o que acontece é que, mesmo sendo descartado, ele continua acumulando memória e não pára, mesmo eu colocando GC.Collect().

    Será que é por causa do Application.DoEvents()?


    quinta-feira, 18 de abril de 2013 14:33

Respostas

  • Parece que me enganei em dizer que resolvi o problema e estou chegando à conclusão de que o Dispose e o Garbage colector não servem para nada.

    no código eu crio um WebBrowser dinamicamente:

    Using Web As New WebBrowser
        With Web
            .Navigate(Url)
            "Código para pegar os dados que eu quero."
            
            .Dispose()
        End With
    End Using

    Detalhe: Isto fica dentro de uma classe que é destruída a cada pesquisa pelo código acima.

    Outro detalhe é que, por acaso, eu estava fazendo um teste quando, ao criar um novo WebBrowser, abriu-se o Internet Explorer na página do teste anterior, ou seja, o Visual Studio não está destruindo o WebBrowser quando sai do bloco Using. O WebBrowser continua na memória. Por isso a memória utilizada pelo programa cresce. O VS2010 está colocando vários WebBrowsers na memória.

    Já tentei colocar este procedimento em uma Thread separada, sem resultados.
    Se alguém estiver passando pelo mesmo problema e tiver uma solução, ficarei muito contente.

    • Marcado como Resposta Oliveira Leal segunda-feira, 12 de janeiro de 2015 16:26
    quinta-feira, 18 de abril de 2013 21:50

Todas as Respostas

  • Aparentemente achei a solução.
    O que eu fiz foi retirar o trecho:

    While Not .ReadyState = WebBrowserReadyState.Complete
        Application.doEvents()
    End While

    e colocar este:

    With Web
    .Navigate(Url)
    SemTexto:

    Dim Final As Date = TimeOfDay.AddSeconds(10)
    While Not TimeOfDay.Second >= Final.Second Application.DoEvents() End While

    If Not .DocumentText.Contains("</html") Then GoTo SemTexto
    End With

    Parece que o Application.DoEvents() dentro do ReadyState do WebBrowser acumulava muita informação do WebBrowser e dentro do TimeOfDay ele não acumula tanto assim.

    Deste jeito, minha aplicação, rodando com os mesmos dados, não passou de 4.300K. Antes chegava a 1.530.560k

     

    • Marcado como Resposta Oliveira Leal quinta-feira, 18 de abril de 2013 15:10
    • Editado Oliveira Leal quinta-feira, 18 de abril de 2013 15:11
    • Não Marcado como Resposta Oliveira Leal quinta-feira, 18 de abril de 2013 21:36
    quinta-feira, 18 de abril de 2013 15:10
  • Parece que me enganei em dizer que resolvi o problema e estou chegando à conclusão de que o Dispose e o Garbage colector não servem para nada.

    no código eu crio um WebBrowser dinamicamente:

    Using Web As New WebBrowser
        With Web
            .Navigate(Url)
            "Código para pegar os dados que eu quero."
            
            .Dispose()
        End With
    End Using

    Detalhe: Isto fica dentro de uma classe que é destruída a cada pesquisa pelo código acima.

    Outro detalhe é que, por acaso, eu estava fazendo um teste quando, ao criar um novo WebBrowser, abriu-se o Internet Explorer na página do teste anterior, ou seja, o Visual Studio não está destruindo o WebBrowser quando sai do bloco Using. O WebBrowser continua na memória. Por isso a memória utilizada pelo programa cresce. O VS2010 está colocando vários WebBrowsers na memória.

    Já tentei colocar este procedimento em uma Thread separada, sem resultados.
    Se alguém estiver passando pelo mesmo problema e tiver uma solução, ficarei muito contente.

    • Marcado como Resposta Oliveira Leal segunda-feira, 12 de janeiro de 2015 16:26
    quinta-feira, 18 de abril de 2013 21:50