我的问题是我创建了一个简单的应用程序,我有webrowser控件。它每20秒导航到一个新站点。经过一定数量的导航后,应用程序占用的内存增加了。我试图处理,删除和再次创建webrouser控件,但无法成功。释放应用程序的所有资源的唯一方法是重新启动它。我花了很多精力试图解决这个问题。请给我一些提示或链接,我可以阅读它。提前谢谢。
实际代码比演示代码大得多,但想法是一样的。代码如下所示:
for (int i = 0; i < 100000; i++)
{
webBrowser1.Navigate("http://stackoverflow.com");
Wait(20000);
}
方法定义:
private void Wait(long value)
{
Stopwatch sw = new Stopwatch();
sw.Start();
while (sw.ElapsedMilliseconds < value)
Application.DoEvents();
}
问题现在不实际,因为使用另一个名为WebKitBrowser的浏览器控件找到了解决方案。感谢所有试图帮助我的人。这是我在这个有光泽的网站上的第一个问题。我很喜欢它。
答案 0 :(得分:0)
您正在阻止主UI线程消息循环并使用Application.DoEvents
,这是邪恶的!
而不是这样,您可以使用System.Windows.Forms.Timer
这样:
class Form1 : Form
{
Timer _Timer;
int _Index = 0;
public Form1()
{
_Timer = new Timer { Enabled = true, Interval = 20000 };
_Timer.Tick += ( s, e ) => TimerTick();
}
void TimerTick()
{
if ( _Index >= 100000 )
{
_Timer.Dispose();
_Timer = null;
return;
}
webBrowser.Navigate( ... );
_Index++;
}
我猜这会解决你的问题。无论如何,这值得做。
答案 1 :(得分:0)
问题仍然存在。我尝试使用下面链接中显示的方法,但没有成功。 How to Fix the Memory Leak in IE WebBrowser Control?
它会暂时减少内存,然后再次显着增加。如此循环。 这是修改后的代码:
public partial class Form1 : Form
{
[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();
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 100000; i++)
{
webBrowser1.Navigate("http://stackoverflow.com");
while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents();
// anytime when I want to reduce the occupied memory I do this
IntPtr pHandle = GetCurrentProcess();
SetProcessWorkingSetSize(pHandle, -1, -1);
}
}
}
答案 2 :(得分:0)
我使用WebKit Browser解决了这个问题。以下是有兴趣使用它的人的链接:http://webkitdotnet.sourceforge.net/basics.php?p=4