2

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

4

3 回答 3

1

问题仍然存在。我尝试使用下面链接中显示的方法,但没有成功。如何修复 IE WebBrowser 控件中的内存泄漏?

它会暂时减少内存,然后再次显着增加。如此循环。这是修改后的代码:

  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);
              }
        }



   }
于 2013-01-13T13:08:02.177 回答
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++;
   }

我猜这会解决你的问题。无论如何,这是值得的。

于 2013-01-12T15:56:24.650 回答
0

我使用 WebKit 浏览器解决了这个问题。这里是那些也有兴趣使用它的人的链接:http ://webkitdotnet.sourceforge.net/basics.php?p=4

于 2013-01-25T10:29:51.500 回答