Rai*_*lle 29 c# memory-leaks webbrowser-control winforms
我试图在C#Winform应用程序中嵌入一个WebBrowser控件.这听起来很容易.但是我发现每次调用Navigate方法时,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的事情,如果你在构建长得多....
我刚刚创建了一个带有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)
或者你可以使用临时文件!
| 归档时间: |
|
| 查看次数: |
40533 次 |
| 最近记录: |