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]

InformationsquelleAutor jeffora | 2010-01-15
Schreibe einen Kommentar