Jak poprawnie wywołać WebBrowser używając multiplethreads?

Zakres problemu:

Piszę aplikację, aby zapisać pliki HTML pobrane zBing iGoogle wyszukiwania. Wiem, że istnieją klasy do wykonywania żądań sieci Web przy użyciu strumienia, takiego jakten przykład, ale ponieważ Google i Bing używają języka JavaScript i Ajax do renderowania wyników w HTML, nie ma możliwości, aby po prostu odczytać strumień i użyć go do osiągnięcia potrzebnego mi rezultatu.

Rozwiązaniem tego jest użycie klasy WebBrowser i przejście do adresu URL, którego chcę, aby przeglądarka sama obsłużyła wszystkie skrypty skryptów JavaScript i Ajax.

Wielowątkowość:

Aby uczynić go bardziej wydajnym, mam tę samą aplikację formularza, która wypuszcza wątek dla każdej usługi (jeden dla Bing, a drugi dla Google).

Problem:

Ponieważ potrzebuję WebBrowser, stworzyłem instancję dla każdego wątku (w tym momencie 2). Według Microsoftu istniejeknown bug that prevents the DocumentCompleted event from firing if the WebBrowser is not visible and is not added to a visible form aswell (po więcej informacji,Śledź ten link).

Prawdziwy problem:

Główny problem polega na tym, żeDocumentCompleted zdarzenie przeglądarki, nigdy nie odpala. Nigdy.

Napisałem odpowiedni program obsługiDocumentCompleted zdarzenie, które nigdy nie otrzymuje wywołania zwrotnego. Do obsługi oczekiwania potrzebnego do uruchomienia zdarzenia przeglądarki zaimplementowałemAutoResetEvent z wysokim limitem czasu (5 minut), który usunie wątek przeglądarki internetowej, jeśli nie uruchomi zdarzenia, którego potrzebuję po 5 minutach.

W tej chwili mam przeglądarkę utworzoną i dodaną do formularza systemu Windows, oba są widoczne, a zdarzenie nadal nie działa.

Niektóre kody:

        // Creating Browser Instance
        browser = new WebBrowser ();

        // Setting up Custom Handler to "Document Completed" Event
        browser.DocumentCompleted += DocumentCompletedEvent;

        // Setting Up Random Form
        genericForm = new Form();
        genericForm.Width = 200;
        genericForm.Height = 200;
        genericForm.Controls.Add (browser);
        browser.Visible = true;  

Jeśli chodzi o nawigację, mam następujące metody (dla przeglądarki):

    public void NavigateTo (string url)
    {
        CompletedNavigation = false;

        if (browser.ReadyState == WebBrowserReadyState.Loading) return;

        genericForm.Show (); // Shows the form so that it is visible at the time the browser navigates
        browser.Navigate (url);
    }

A na wezwanie nawigacji mam to:

            // Loading URL
            browser.NavigateTo(URL);

            // Waiting for Our Event To Fire
            if (_event.WaitOne (_timeout))
            {
               // Success
            }
            { // Error / Timeout From the AutoResetEvent } 

TL: DR:

Mój WebBrowser jest tworzony w innym STAThread, dodawanym do formularza, oba są widoczne i wyświetlane, gdy uruchamia się nawigacja przeglądarki, ale zdarzenie DocumentCompleted z przeglądarki nigdy nie jest uruchamiane, więc AutoResetEvent zawsze przekracza limit czasu i nie mam odpowiedzi z przeglądarki .

Dzięki w Advance i przepraszam za długi post

questionAnswers(1)

yourAnswerToTheQuestion