webbrowser控件 - 释放应用程序的资源

时间:2013-01-12 15:28:56

标签: c# .net

我的问题是我创建了一个简单的应用程序,我有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的浏览器控件找到了解决方案。感谢所有试图帮助我的人。这是我在这个有光泽的网站上的第一个问题。我很喜欢它。

3 个答案:

答案 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