如何修复IE WebBrowser控件中的内存泄漏?

Rai*_*lle 29 c# memory-leaks webbrowser-control winforms

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

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

IE WebBrowser控件中的内存泄漏

一个人建议升级到IE8来解决问题.

但是,无论用户是否安装了最新的IE版本,我都需要一个解决方案.我无法控制用户环境.

有人知道如何释放WebBrowser控件占用的内存吗?有变通方法吗?是否有WebBrowser控件的替代品?

更新: 我刚做了几个测试.在工作中我运行的是Windows XP和IE6.记忆力并没有在那里增长.调用导航方法时内存增加但一段时间后释放.在家我运行Vista并升级到IE8.在这里,我也不再看到问题了.看起来问题是IE7特有的.因此,问题应该改为"如何在安装IE7时修复IE WebBrowser控件中的内存泄漏".任何人都可以确认这个问题是否特定于IE7?

wom*_*omd 10

我的应用程序在导航时也不断消耗内存,而不再释放.我在这里为我提供解决方案: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();
Run Code Online (Sandbox Code Playgroud)

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

        IntPtr pHandle = GetCurrentProcess();
        SetProcessWorkingSetSize(pHandle, -1, -1);
Run Code Online (Sandbox Code Playgroud)

所有荣誉: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 搜索它的权利,所以我能找到它;)

问候

编辑:如果这有助于您快速解决问题 - 好.但你应该overthing您的应用程序设计,您使用如果有的话,该模式refactore的事情,如果你在构建长得多....

  • 这不是解决问题的方法,它只是隐藏它.Windows继续使用过多的内存,只是它立即用于页面文件内存(您可以在"页面错误"列下的"任务管理器"中看到这一点.),而不是物理内存.这意味着每次尝试最小化此解决方案的使用时,Windows都会将泄漏的内存写入页面文件中的磁盘.最后,这意味着你的应用程序将比以前慢,因为磁盘驱动器会定期颠簸,你仍然会耗尽页面文件和内存.这解决了什么. (18认同)
  • 我尝试了这一点,它所做的就是让它看起来因为它在任务管理器中使用较少的内存,但是应用程序在一段时间后变得没有响应,就像我没有调用此函数一样.这是主题:http://stackoverflow.com/questions/6147923/webbrowser-memory-problem (4认同)

BFr*_*ree 7

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

因此,虽然每次"导航"时它都会占用内存,但这不是内存泄漏,而是内存将被释放.如果它的速度过快,只需调用GC.Collect();


小智 7

BASIC IDEA是,

"杀死自己,重生."

Windows将解决所有内存问题.

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

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

首先打开一个新的,然后关闭一个旧的.


public void SOLVE_ALL_MY_MEMORY_PROBLEM()
{
  System.Diagnostics.Process.Start("MyProgram.exe");
  Application.Exit();
}
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

转到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());
    }
Run Code Online (Sandbox Code Playgroud)

并转到Form1.cs并创建另一个Form1()

    public Form1()
    {
        InitializeComponent();
    }

    public Form1(string dance_name)
    {
        InitializeComponent();

        ...
    }
Run Code Online (Sandbox Code Playgroud)

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


Bea*_*692 0

我在应用程序中使用 Web 控件,但由于我的应用程序仅导航到一页,所以我没有注意到您提到的问题。还有另一个 Web 控件实际上是一个包装器,我不知道它是否有同样的问题。你可以在这里找到它。