Questo è un problema vecchio e ampiamente noto con il controllo .NET Webbrowser.Come aggirare la perdita di memoria nel controllo .NET Webbrowser?
Riepilogo: Avere il controllo del browser Web .NET Passare a una pagina aumenta l'utilizzo della memoria che non viene mai liberato.
Riprodurre la perdita di memoria: aggiungere un controllo WebBrowser a un modulo. Usalo per navigare verso le pagine che desideri. a proposito di: lavori vuoti, scorrendo verso il basso su Google Immagini fino a quando il tuo utilizzo è di 100 MB + e quindi sfogliare altrove per notare che quasi tutta la memoria viene liberata è una dimostrazione più drammatica.
I miei requisiti attuali per un'applicazione includono l'esecuzione per lunghi periodi di tempo, visualizzando una finestra del browser IE7 limitata. Anche l'esecuzione di IE7 con una configurazione bastarda di hook, BHO e criteri di gruppo non è desiderata, anche se in questo momento sembra che sia il fallback. L'incorporamento di un browser in un'applicazione Windows Form è. L'utilizzo di una diversa base di browser non è un'opzione disponibile per me. È richiesto IE7.
discussioni precedenti ed articoli relativi a questo noto perdita di memoria:
- http://www.vbforums.com/showthread.php?t=644658
- How to Fix the Memory Leak in IE WebBrowser Control?
- Memory leak when using WPF WebBrowser control in multiple windows
- http://social.msdn.microsoft.com/Forums/en-US/ieextensiondevelopment/thread/88c21427-e765-46e8-833d-6021ef79e0c8/
- http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/8a2efea4-5e75-4e3d-856f-b09a4e215ede
- http://dotnetforum.net/topic/17400-appdomain-webbrowser-memory-leak/
correzioni Spesso-proposte che non funzionano:
- Andando a diverse pagine non importa. about: blank fa scattare la perdita. Non richiede una pagina per avere javascript o qualsiasi altra tecnologia aggiuntiva.
- L'utilizzo di versioni diverse di Internet Explorer non è importante. 7, 8 e 9 mostrano tutti gli stessi sintomi e, per quanto ho sentito, tutte le versioni hanno la stessa perdita di memoria nel controllo.
- L'eliminazione del controllo non è d'aiuto.
- La raccolta dei rifiuti non aiuta. (In effetti, la ricerca su cui ho fatto riferimento indica che la perdita è nel codice COM non gestito che include il controllo Webbrowswer.)
- Ridurre al minimo e impostare la memoria disponibile del processo su -1, -1 (SetProcessWorkingSetSize() o simimlar.) Solo riduce l'utilizzo della memoria fisica, non ha alcun impatto sulla memoria virtuale.
- Chiamare WebBrowser.Stop() non è una soluzione e interrompe la funzionalità per l'utilizzo di qualsiasi cosa tranne pagine Web statiche, senza fare altro che ridurre al minimo la perdita.
- Forzare l'attesa del caricamento completo di un documento prima che la navigazione in un'altra non sia di aiuto.
- Caricamento del controllo in un'app separataDomain non risolve il problema. (Non l'ho fatto da solo, ma la ricerca mostra che altri non hanno avuto successo con questa rotta.)
- L'utilizzo di un wrapper diverso come csexwb2 non aiuta, poiché anche questo ha lo stesso problema.
- Cancellare la cache dei file temporanei Internet non fa nulla. Il problema è nella memoria attiva, non sul disco.
La memoria viene cancellata quando l'intera applicazione viene chiusa e riavviata.
Sono disposto a scrivere direttamente il mio controllo del browser in API COM o Windows, se questa è una correzione sicura del problema. Certo, preferirei una soluzione meno complicata; Preferisco evitare di scendere ai livelli più bassi per fare le cose, perché non voglio reinventare la ruota in termini di funzionalità supportate di un browser. Letalone duplicazione di funzionalità IE7 e comportamenti non standard in un browser in stile roll-your-own.
Aiuto?
Potrebbe essere possibile avviare la parte del browser in un'altra applicazione e comunicare con esso tramite .Net remote o WCF o qualcosa del genere? È possibile monitorare l'utilizzo della memoria e quindi chiuderla e riavviarla quando raggiunge una determinata soglia. – pstrjds
@pstrjds: Penso che sia l'unica soluzione effettiva che sarà un enorme problema da implementare e limiterà definitivamente la funzionalità. – Juan
È un comune malinteso che il rilascio di memoria ridurrà istantaneamente la dimensione VM di un processo. Non è così che funziona il gestore della memoria di Windows. –