Wie kann ich einen WebBrowser mit Multi-Threads richtig aufrufen?

Problemumfang:

Ich schreibe eine Anwendung, um die HTML-Dateien zu speichern, die von der Website abgerufen wurdenBing undGoogle sucht. Ich weiß, dass es Klassen gibt, um die Web-Anfragen mit Stream wie auszuführendieses BeispielAber da Google und Bing sowohl Javascript als auch Ajax verwenden, um die Ergebnisse in HTML zu rendern, kann ich den Stream nicht einfach lesen und zum gewünschten Ergebnis gelangen.

Die Lösung besteht darin, die WebBrowser-Klasse zu verwenden und zu der gewünschten URL zu navigieren, damit der Browser selbst alle JavaScript- und Ajax-Skriptausführungen verarbeitet.

MultiThreading:

Um es effizienter zu machen, habe ich die gleiche Formularanwendung, die einen Thread für jeden Dienst auslöst (einen für Bing und einen für Google).

Problem:

Da ich den WebBrowser benötige, habe ich einen für jeden Thread instanziiert (das sind momentan 2). Laut Microsoft gibt es eineknown bug that prevents the DocumentCompleted event from firing if the WebBrowser is not visible and is not added to a visible form aswell (für mehr Informationen,folgen Sie diesem Link).

Echtes Problem:

Das Hauptproblem ist, dass dieDocumentCompleted Ereignis des Browsers, nie feuert. Noch nie.

Ich habe einen richtigen Handler für das geschriebenDocumentCompleted Ereignis, das den Rückruf nie erhält. Um die Wartezeit zu bewältigen, die für das Auslösen des Browser-Ereignisses benötigt wird, habe ich ein implementiertAutoResetEvent Mit einem hohen Timeout (5 Minuten) wird der Webbrowser-Thread gelöscht, wenn das benötigte Ereignis nach 5 Minuten nicht ausgelöst wird.

Im Moment habe ich den Browser erstellt und in eine WindowsForm eingefügt, beide sind sichtbar und das Ereignis wird immer noch nicht ausgelöst.

Ein bisschen Code:

        // 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;  

Für die Navigation habe ich folgende (Methode für den Browser):

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

Und für den Aufruf der Navigation habe ich folgendes:

            // Loading URL
            browser.NavigateTo(URL);

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

TL: DR:

Mein WebBrowser wird in einem anderen STAThread instanziiert und einem Formular hinzugefügt. Beide werden sichtbar und angezeigt, wenn die Browsernavigation ausgelöst wird. Das DocumentCompleted-Ereignis des Browsers wird jedoch nie ausgelöst, sodass das AutoResetEvent immer eine Zeitüberschreitung aufweist und der Browser keine Antwort erhält .

Vielen Dank im Voraus und sorry für den langen Beitrag

Antworten auf die Frage(1)

Ihre Antwort auf die Frage