WebBrowser 中,无法释放内存?

RayLynn 2012-08-06 05:35:22

public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}

protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);

webBrowser1.Navigate("http://www.qq.com/");
}

protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);

webBrowser1.Dispose();
webBrowser1 = null;
}
}





///////////////////////

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void timer1_Tick(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(delegate
{
Form2 f = new Form2();

System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
timer.Interval = 2000;
timer.Tick += delegate(object o, EventArgs args)
{
timer.Dispose();
f.Close();
};
timer.Start();
f.ShowDialog();

Thread.CurrentThread.Abort();
}));
thread.IsBackground = true;
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
}


在 Form1 中,会自动不断打开新的 Form2 同时延迟2秒后自动关闭 Form2
在这个过程中,我们观察任务管理器的内存使用和线程数量,会发现增长迅速而且很夸张。过几分钟就内存溢出崩溃掉。
请问是什么原因导致,有没有什么解决方案?
...全文
1612 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
江南野鹤 2015-02-04
  • 打赏
  • 举报
回复
引用 20 楼 championlinguiyi 的回复:
碰到一样的问题,在msdn上找到了答案,我贴出来给大家看看,我用了反正完美解决了 https://social.msdn.microsoft.com/Forums/ie/en-US/88c21427-e765-46e8-833d-6021ef79e0c8/memory-leak-in-ie-webbrowser-control?forum=ieextensiondevelopment
-- 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);
好办法
championlinguiyi 2014-12-26
  • 打赏
  • 举报
回复
碰到一样的问题,在msdn上找到了答案,我贴出来给大家看看,我用了反正完美解决了 https://social.msdn.microsoft.com/Forums/ie/en-US/88c21427-e765-46e8-833d-6021ef79e0c8/memory-leak-in-ie-webbrowser-control?forum=ieextensiondevelopment
-- 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);
思杰软件 2014-08-09
  • 打赏
  • 举报
回复
加载完成后销毁才可以,否则不可能。。。
qaz952727 2014-06-14
  • 打赏
  • 举报
回复
我也在找答案,在Form2中加个一个 webBrowser1.Navigate("http://www.baidu.com"); 然后Form1中去new他,每new一次线程就增加十几条,释放了也没作用。求大神解答嘛
火雷 2013-11-28
  • 打赏
  • 举报
回复
果然难,至今无解
wy811007 2013-11-13
  • 打赏
  • 举报
回复
谁解决了啊 发出来学习下
Wildwolf 2012-11-22
  • 打赏
  • 举报
回复
5#和6#的方法是可行的,楼主可以试试。如果有更好的方法,贴出来看看。
xtfnpgy 2012-11-21
  • 打赏
  • 举报
回复
请问楼主问题解决了,我也遇到相同的问题。。。
xiaoye51888 2012-11-21
  • 打赏
  • 举报
回复
同求解惑,我也遇到这个困扰了,我的 webBrowser,单线程,设置每秒refresh 1次,结果发现内存每秒增加3M,后台过一会儿就2个G了(电脑4个G内存),然后提示内存不足崩溃了,其实我就是想不断刷新一个页面监控上面的几个数字,一旦有我要求的弹框提示,然后直接进行一些操作,不需要之前获取到的历史数据,完全可以每次只缓冲当前页面的东西就行了,结果内存不到一小时溢出一次。。
RayLynn 2012-08-08
  • 打赏
  • 举报
回复
没人会吗???


顶啊顶啊顶啊顶啊顶啊
RayLynn 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

那就不要用 webbrowser 啊,直接用 WebClient 或者 HttpWebRequest 就可以了。
[/Quote]

我需要的是UI,不是网络通讯。

那么多基于IE的浏览器都没有解决这样问题的方法吗?
机器人 2012-08-06
  • 打赏
  • 举报
回复
那就不要用 webbrowser 啊,直接用 WebClient 或者 HttpWebRequest 就可以了。
SocketUpEx 2012-08-06
  • 打赏
  • 举报
回复
new Thread 这点开销相对 WebBrowser 这大家伙来说算不得什么了


lizhibin11 2012-08-06
  • 打赏
  • 举报
回复
这个实际上多线程与否并不重要,我试了一下全部走主界面UI线程,也不行。楼上那位朋友说的多进程应该是好办法。
机器人 2012-08-06
  • 打赏
  • 举报
回复
new Thread 也是有开销的啊,不是说线程越多越好。推荐是和CPU数量相等的线程数。

hpygzhx520 2012-08-06
  • 打赏
  • 举报
回复
SetProcessWorkingSetSize绝对不是个好主意。好在楼主注释了。
SocketUpEx 2012-08-06
  • 打赏
  • 举报
回复
我也是想到用SetProcessWorkingSetSize
原来楼主的代码里已经有了


hpygzhx520 2012-08-06
  • 打赏
  • 举报
回复
这是个很难的问题。应该很难有完美的解决办法。不过我试了下我的浏览器http://www.xzwj.org/,反复打开你的测试页面,基本能恢复。因为这个页面算简单页面了。大量FLASH的才真的头疼。
hpygzhx520 2012-08-06
  • 打赏
  • 举报
回复
在没有使用多进程的时候,微软的IE也没法解决这个问题
SocketUpEx 2012-08-06
  • 打赏
  • 举报
回复
很简单嘛
价钱这么高啊


加载更多回复(1)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧