webbrowser控制与内存增加问题

时间:2010-02-04 11:00:07

标签: c#

我有一个程序,当它打开一个页面时会逐个浏览网址链接,它会增加内存使用量并继续增加.i在两三个小时之后发现它占用了我的内存的1和半gb来打开一个hunderd页面我该如何解决这个问题。

3 个答案:

答案 0 :(得分:2)

SetProcessWorkingSetSize实际上不会释放任何内存。 它确实增加了被分页到磁盘的内存的概率, 并可能导致GC收集。

我不了解WebBrowser控件的后台工作方式,但我意识到一件事:

我的程序会浏览500页或更多页面并在其上读取新内容。它占用了RAM 很快,如果我再次运行所有这些页面的相同功能,它只是从webbrowser缓存中读取,因此只需要几秒钟即可完成。

这意味着我们只需要清除浏览器缓存以释放RAM。对?我发现 这个解决方案,但它不起作用。

http://support.microsoft.com/kb/326201/en-us

总是给我PrtectedMemoryException ...

好的,那么只有当我关闭我的应用程序时才能释放内存 当我处理我的webbrowser控件并创建一个新控件时,它没有被释放?

答案 1 :(得分:1)

根据this answerthe same question,内存在每个页面请求/加载时会增加,但会在一段时间内释放 - 这意味着它实际上不是内存泄漏。尝试最小化应用程序窗口 - 然后释放内存吗?

在这种情况下,您可以尝试通过此代码定期修剪应用程序的工作集(来自this forum thread,mike_t2e的答案):

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

// ...

// Call this when you want to trim the working set
IntPtr pHandle = GetCurrentProcess();
SetProcessWorkingSetSize(pHandle, -1, -1);

答案 2 :(得分:0)

RT _>它总是给我ProtectedMemoryException

将您的平台从项目属性更改为x86 - >建立或替换

returnValue = DeleteUrlCacheEntry(internetCacheEntry.lpszSourceUrlName);

internetCacheEntry.lpszLocalFileName