如何解决在IE WebBrowser控制内存泄漏?

我试图在C#Winform应用程序中嵌入一个WebBrowser控件。 这听起来很简单。 但是,我发现每次调用Navigate方法时,WebBrowser控件都会消耗大量内存。 内存永远不会释放。 内存使用量增长和增长...

网络上的许多人有完全相同的问题,但我还没有找到满意的答案。 这是迄今为止我发现的关于这个问题的最佳讨论:

IE WebBrowser控件中的内存泄漏

有人建议升级到IE8来解决这个问题。

不过,我需要一个解决方案,无论用户是否安装了最新的IE版本,都可以运行。 我无法控制用户环境。

有人知道如何释放WebBrowser控件所占用的内存吗? 有解决方法吗? WebBrowser控件是否有其他选择?

更新:我只做了更多的测试。 在工作中,我运行Windows XP和IE6。 记忆不在那里增长。 调用导航方法时内存会增加,但在一段时间后会释放内存。 在家里我正在运行Vista并升级到IE8。 在这里,我也没有看到问题了。 看起来这个问题是针对IE7的。 所以这个问题应该改为“IE7安装时如何修复IE浏览器控制中的内存泄漏”。 任何人都可以确认这个问题是特定于IE7?


我的应用程序在导航时也不断消耗内存,而不再释放。 我在这里为我解决了这个问题:http://social.msdn.microsoft.com/Forums/en-US/ieextensiondevelopment/thread/88c21427-e765-46e8-833d-6021ef79e0c8

为了完整性,张贴了一段引人注目的摘录:

-- 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();

- 当你想减少内存时调用的代码

        IntPtr pHandle = GetCurrentProcess();
        SetProcessWorkingSetSize(pHandle, -1, -1);

所有荣誉:http://social.msdn.microsoft.com/profile/mike_t2e/?type=forum&referrer=http://social.msdn.microsoft.com/Forums/en-US/ieextensiondevelopment/thread/88c21427-e765 -46e8-833d-6021ef79e0c8发布解决方案。

和http://ict-engineer.blogspot.com/2010/10/net-webbrowser-control-memory-leak.html对于SEO的正确,所以我可以找到它;)

问候

编辑:如果这可以帮助你快速解决问题 - 好。 但是你应该颠覆你的应用程序设计,如果你使用了这种模式,那么重构你的应用程序设计,重构这些东西......


我刚刚创建了一个带有Web浏览器控件的简单应用程序,以尝试复制结果。 我发现是的,每当你浏览一个页面,正在使用的内存就会显着增加。 但是,这不是内存泄漏,因为如果你继续导航,你会发现在一段时间后,内存会显着下降,表明垃圾收集器做的是事情。 为了证明这一点,我在每次打电话给Navigate之后都强制收集垃圾收集器,并且在每次导航调用之后,所用的整个内存保持几乎相同的数量。

所以,虽然每次“导航”时都会占用内存,但这不是内存泄漏,并且内存将被释放。 如果速度过快,只需调用GC.Collect();


BASIC IDEA是,

“杀死自己,重生。”

Windows将解决所有内存问题。

但如果您先关闭应用程序,则无法启动新的应用程序。

所以, 开始一个新的,并关闭老一个。

首先打开一个新的,关闭一个旧的。


public void SOLVE_ALL_MY_MEMORY_PROBLEM()
{
  System.Diagnostics.Process.Start("MyProgram.exe");
  Application.Exit();
}

https://www.youtube.com/watch?v=aTBlKRzNf74

如果有参数,

public void SOLVE_ALL_MY_MEMORY_PROBLEM()
{
  System.Diagnostics.Process.Start("MyProgram.exe", "PARA_para_dance");
  Application.Exit();
}

转到Program.cs

    static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        if(args.Count() > 0)
            Application.Run(new Form1(args[0]));
        else
            Application.Run(new Form1());
    }

和,转到Form1.cs并使另一个Form1()

    public Form1()
    {
        InitializeComponent();
    }

    public Form1(string dance_name)
    {
        InitializeComponent();

        ...
    }

或者你可以使用临时文件!

链接地址: http://www.djcxy.com/p/41819.html

上一篇: How to Fix the Memory Leak in IE WebBrowser Control?

下一篇: Why won't iframe div scroll on iPad?