C# Webbrowser使用加载页面多少了内存泄露问题解决方法汇总

[C#]有关WebBrowser内存使用增加问题  
 
在Windows程序开发中,使用了Webbrowser 控件,陆续发觉该控制存在着不少的问题,当中最严重的是他胃口太好太大,每load一个页面便会吃掉十来M的内存。

Webbrowser是非托管代码,而我开发时用了托管代码,一开始在这方面进行了优化,发现效果没什么改善。

后一查资料才发现病根 Microsoft的内存溢出bug,微软给出了补丁,但是微软声称说没有经过回归测试,但无论如何,这是官方提供的解决方案,也是比较冶本的。综合考虑,后来我取用了第一和第二种相结合的方式,给Webbrowser瘦了身。


一、官方解决方案

官网下载
http://support.microsoft.com/kb/943510/zh-cn

这个方法 对于window 7.0 使用发现在补丁不能使用,xp.server2003 可以考虑使用


二、程序解决方案
后又有网友从程序模式的思路上提供了二种解决方案:

1,建立线程,动态创建WebBrowser,再试用完后freeandnil,线程销毁WebBrowser所占用的内存也随即销毁~

2,建立多程序,通过程序1,调用程序2进行页面访问,当操作完后,程序2退出,内存自动清除回收,程序与程序之间的信息交互可通过ini文件的读取和保存~

[color=red][b]三、升级运行环境解决方案[/b][/color]


还有网友提供了下面这种方案:

把IE升级到IE8以后,这一BUG将不复存在了。
该兄弟声称升级IE后,生成的EXE文件可用,如果是用VB6开发的源程序,则又不能识别webbrowser控件了。
这时可以采用修改注册表,注册组件的方法解决这一问题:

将下面文字另存为一个.reg文件双击导入注册表:

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\TypeLib\{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}]
[HKEY_CLASSES_ROOT\TypeLib\{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}\1.1]
@="Microsoft Internet Controls"
[HKEY_CLASSES_ROOT\TypeLib\{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}\1.1\0]
[HKEY_CLASSES_ROOT\TypeLib\{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}\1.1\0\win32]
@="C:\\WINDOWS\\system32\\ieframe.dll"

 
 
WebBrowser窗口自动滚动:
this.webBrowser.Document.Window.ScrollTo(0, webBrowser1.Document.Body.ScrollRectangle.Height);
 
WebBrowser的脚本出错信息:
当页面上的脚本出错时,一般情况下会弹出脚本出错提示,如果在用WB写爬虫一类的时候,这类提示可能会导致系统不能工作,解决的发是:
(1)设置属性ScriptErrorsSurpressed = true;
(2)打开IE的设置 "Internet选项" - "高级" - 勾选"禁用脚本调试"
 
WebBrowser的内存释放:
WB的内存开销很大,当连续打开很多网页时这个问题将会非常明显,甚至耗尽内存,解决的方我在MSDN论坛上找到(来源: http://social.msdn.microsoft.com/Forums/en-US/ieextensiondevelopment/thread/88c21427-e765-46e8-833d-6021ef79e0c8/ ),具体如下:
 
推荐使用这种方法
 
回答者:Puremic
 
This solution worked for me!! 
Thank you so much mike_t2e!!!!!!!

-----------------------------------------------------------------------

Is the memory released when you minimize the app ? If so, try this:


-- in class definition 

        [DllImport("KERNEL32.DLL", EntryPoint = "SetProcessWorkingSetSize", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
        internal static extern bool SetProcessWorkingSetSize(IntPtr pProcess, int dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize);

        [DllImport("KERNEL32.DLL", EntryPoint = "GetCurrentProcess", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
        internal static extern IntPtr GetCurrentProcess();

-- code to call when you want to reduce the memory

            IntPtr pHandle = GetCurrentProcess();
            SetProcessWorkingSetSize(pHandle, -1, -1);
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值