Speicherleck bei der Verwendung von WPF WebBrowser-Steuerelement in mehreren Fenstern
Ich bin an einem Projekt arbeiten, macht Gebrauch von der WPF WebBrowser-Steuerelements (System.Windows.Controls.WebBrowser). Das web browser element des Programms ist eine von vielen Aktivitäten die Benutzer können sich in, und wird in einem separaten Fenster geöffnet. Nachdem der Benutzer navigiert Weg von der browser, das Fenster wird geschlossen, und ein neues Fenster wird jedes mal erstellt, wenn der Benutzer zurück an den browser. Wir waren zu bemerken, ein erheblicher Speicherverlust /Leistung downgrade in unserem Programm (Nutzung immer bis zu ~700 MB von ~200 initial) auf ständig über den browser. Nach dem fehlschlagen zu finden, die alle Punkte von Ressourcenlecks in unserem eigenen code, habe ich beschlossen, um festzustellen, ob das Problem war mit unseren eigenen WebBrowser-wrapper-Steuerelements oder der WPF-Steuerelement.
Erstellte ich ein neues einfaches Projekt, das nur aus einem Hauptfenster und einem WebWindow. Eine Schaltfläche auf dem Hauptfenster öffnet ein browser-Regie bei gmail (die Seite, die wir bemerkt, dass das größte Problem mit den paar, die wir untersucht). Nach dem schließen dieses Fensters, es gibt keine Freigabe von Ressourcen (keine Minderung der VM-Größe, die im Task-Manager oder Prozess-Explorer) und die Anzahl der GDI-Objekte der Prozess hat Griffe zum abnehmen nicht (das Programm startet mit ~30, beim öffnen des browser dauert es ~140 und nach dem schließen des browser - ~140 sind noch offen). Öffnen Sie einen anderen browser, wird mehr behandelt, und mehr Ressourcen zugewiesen werden. Darüber hinaus ist dieses problem nicht behoben ist, indem speziell der Aufruf von Dispose() auf das WebBrowser-Steuerelement. Der code ist einfach und lautet wie folgt:
Hauptfenster:
<Window x:Class="WebBrowserMemory.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
<Button Click="Button_Click">Gmail</Button>
</StackPanel>
</Grid>
</Window>
Button_Click:
private void Button_Click(object sender, RoutedEventArgs e)
{
var win = new WebWindow();
win.Show();
win.Browser.Navigate("http://www.gmail.com");
}
Web-Fenster:
<Window x:Class="WebBrowserMemory.WebWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WebWindow" Height="300" Width="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<WebBrowser Grid.Row="0" x:Name="_browser" />
<Button Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="10" Padding="10" Click="Button_Click">Close</Button>
</Grid>
</Window>
Relevante Code:
public WebBrowser Browser {
get { return _browser; }
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Close();
}
protected override void OnClosed(EventArgs e)
{
_browser.Dispose();
base.OnClosed(e);
}
Hat jemand sonst begegnet diesem Problem mit dem WPF WebBrowser-Steuerelement?
[UPDATE: Aktualisiert die post zu geben Dispose () - Aufruf als pro itowlson Antwort - sogar der Aufruf von Dispose() auf dem web-browser-Steuerung nicht frei ist, die Ressourcen]
- jedes update auf dieser?
- Soweit ich weiß ist es noch vorhanden. Ich zog mit einem Gecko-wrapper, und bin auf der Suche, ersetzen Sie die Komponente mit Awesomium in Zukunft
- Ich habe das gleiche Problem und noch keine Lösung finden. Irgendwelche Ideen?
- Siehe diese SO post - ich habe eine Lösung gefunden, um dieses - stellt sich heraus, es war ein Schurke JS-plugin.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Gegensatz zu den meisten WPF-Steuerelemente WebBrowser (weil es erbt von HwndHost) ist IDisposable und kapselt nicht verwaltete Ressourcen. Das WPF-Fenster, im Gegensatz zu den WinForms Form, macht nicht automatisch entsorgen Sie Ihren Kindern (weil native WPF-Steuerelemente nicht Kapseln von nicht verwalteten Ressourcen und erfordern keine Entsorgung).
Hinzufügen eines OnClosed überschreiben, um Ihre Fenster (oder Sie behandeln das Geschlossene Veranstaltung), und rufen Sie Dispose auf das WebBrowser-Steuerelement.
Haben wir stattdessen verwendet Windows forms-WebBrowser-Steuerelement, das erstellt wurde, innerhalb FormsHost in WPF, aber beide funktionieren ziemlich gleich aus UI-Sicht, aber wir haben festgestellt, dass der WebBrowser von WinForms hat bessere Funktionen und eine bessere Leistung im Vergleich zu einem in WPF.
Können Sie manuell entsorgen WebBrowser von Windows forms-Steuerelement, das wird sicher entsorgen alle seine Kinder und freie Ressourcen entsprechend, jedoch mit meiner bisherigen Erfahrung, WinForm den WebBrowser nicht freigegeben, 100% Ihrer Ressourcen nach dem schließen, aber ja, es ist weit besser, dann WPF.
Ich nicht in der Lage, vollständig zu lösen, das Leck habe ich jedoch bemerkt, dass die Navigation des Browsers "about:blank" vor der Entsorgung hilft definitiv reduzieren Sie die Menge des Speichers, der hängt herum.