0

1/10 秒ごとにタイマーを実行しています ( Interval = 100)。コントロールにサイトをロードし、ロードするWebBrowserたびにスパン ID に情報を取得するため、無限ループになっています。私の問題は、このプロセスが長時間実行されると、メモリ リークが発生することです。

30 分で、メモリ使用量が 800MB 以上になることがあります。プログラムが実行中にメモリを継続的に使用しないようにするにはどうすればよいですか?

これが関連コードです。プロセス作成コードはまだ含まれていません。

private void buttonBid_Click(object sender, EventArgs e)
{
    ID = Convert.ToInt32(textBoxID.Text);
    getItem();
    return;
}

private void getItem()
{
    webBrowser.Url = new Uri("http://www.test.com/?id=" + ID);
    webBrowser.DocumentCompleted += webBrowser_DocumentCompleted;
    return;
}

private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    timerLoad.Start();
    return;
}

private void timerLoad_Tick(object sender, EventArgs e)
{
    var elem = webBrowser.Document.GetElementById("product_" + ID);

    textBoxProduct.Text = Convert.ToString(elem.InnerText);

    timerLoad.Dispose();
    timerLoad.Start();
}
4

2 に答える 2

4

メモリリークの原因として考えられるのは、複数のイベント バインディングです。

メソッドが呼び出されるDocumentCompletedたびにイベントをバインドします。たとえば、クラスのコンストラクターで一度GetItemバインドする必要があります。DocumentCompleted

ただし、ボタンを 1 回だけ押した場合、これは主な問題にはなりません。

問題のトラブルシューティングに.NET Memory Profiler 4.0をお勧めします。

また、もう少し調べてみましたが、問題はWebBrowserコンポーネントの使用にある可能性があります。この質問を参照してください。

于 2012-07-20T15:42:33.627 に答える