如何解决在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