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 Browser を使用して問題を解決しました。これを使用することに興味がある人のためのリンクは次のとおりです: http://webkitdotnet.sourceforge.net/basics.php?p=4

于 2013-01-25T10:29:51.500 に答える