我正在使用一个使用
WPF Webbrowser控件(System.
Windows.Controls.Webbrowser)的项目.程序的Web浏览器元素是用户可以从事的许多活动之一,并在单独的窗口中打开.用户从浏览器导航后,窗口关闭,每次用户返回浏览器时都会创建一个新窗口.持续使用浏览器后,我们注意到我们的程序中的内存泄漏/性能降级显着(使用率从〜200初始达到〜700MB).在我们自己的代码中找不到任何资源泄漏点后,我决定使用我们自己的Webbrowser包装器控件或WPF控件来确定问题.
我创建了一个新的简单项目,只有一个MainWindow和一个WebWindow.主窗口上的一个按钮启动了一个指向gmail的浏览器(我们注意到我们检查过的最少的问题).关闭此窗口时,不会释放资源(任务管理器或进程资源管理器中的VM大小不会减少),进程处理的GDI对象数量不会减少(程序以〜30开头,打开浏览器它到〜140和关闭浏览器〜140仍然是打开的).打开另一个浏览器会导致更多的句柄和更多的资源被分配.此外,这个问题不能通过在Webbrowser控件上专门调用dispose()来解决.代码很简单,如下所示:
主窗口:
<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"); }
网页窗口:
<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>
相关代码:
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); }
有没有人使用WPF Webbrowser控件遇到这个问题?
[更新:根据itowlson的答案更新帖子来指示dispose()调用 – 即使在Web浏览器控件上调用dispose()也不释放资源]
解决方法
原文地址:https://www.jb51.cc/csharp/95768.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。