Как освободить память при навигации по веб-документам с помощью элемента управления Windows.Forms.WebBrowser - PullRequest
1 голос
/ 27 марта 2012

Следующий код, запущенный в форме Windows, создает элемент управления WebBrowser и перемещается по нескольким URL-адресам.Каждый раз, когда URL-адрес перемещается к памяти, используемой приложением, увеличивается и, кажется, никогда не освобождается.В моем случае потребляемая память возрастает с ~ 10 Мб до ~ 45 Мб, просматривая только 4 документа.Мне нужно перемещаться по нескольким сотням документов, что быстро приводит к использованию всей физической памяти.

Как освободить ресурсы, используемые элементом управления WebBrowser?

    private void ProcessDocs()
    {
        Random rnd = new Random();
        DateTime dtWaitUntil = DateTime.Now;
        string[] arrInputUrl = new string[] { "http://www.google.co.uk/", "http://www.google.com/", "http://www.yahoo.com/", "http://www.amazon.co.uk/" };

        for (int i = 0; i < arrInputUrl.Length; i++)
        {
            using (WebBrowser objWebBrowser = new WebBrowser())
            {
                string txtInputUrl = arrInputUrl[i];
                tboxTestingOutput.Text += "\r\n" + txtInputUrl;

                objWebBrowser.ScriptErrorsSuppressed = true;
                objWebBrowser.Navigate(txtInputUrl);

                //Should do this a better way, but, wait 10 secs for document to complete.
                //Would use objWebBrowser.DocumentCompleted event
                //but it seems to fire several times per document load!!!
                dtWaitUntil = DateTime.Now.AddSeconds(10);

                do
                {
                    Application.DoEvents();
                } while (DateTime.Now < dtWaitUntil);

                //Do whatever I need to with the document contents
                //...
                //...
            }
        }

        tboxTestingOutput.Text += "\r\nFinished";
    }

1 Ответ

0 голосов
/ 27 марта 2012

Хотя я бы не рекомендовал это полностью, P / Invoke SetProcessWorkingSetSize со значением -1 должен привести к пустому пустому рабочему набору процесса, например:

[DllImport("kernel32.dll")]
static extern bool SetProcessWorkingSetSize(IntPtr handle, int minSize, int maxSize);

SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle,-1,-1);

Подробнее здесь:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686234(v=vs.85).aspx

...