2010-09-25 15 views
8

Ich möchte die Ausführung meines Threads anhalten, bis ein bestimmtes Div über Ajax in eine WebBrowser-Instanz geladen wurde. Natürlich kann ich kontinuierlich überprüfen auf das Vorhandensein dieses DIV tut so etwas wie:Warten auf WebBrowser ajax Inhalt

while (Browser.Document.GetElementById("divid") == null) { Thread.Sleep(200); } 

jedoch den Faden schlafen, dass der Browser ist in zwischen den Schleifen nur blockiert den Browser von tatsächlich den Inhalt in erster Linie zu laden. Es scheint daher, dass ich die Browser.Navigate Methode in einem separaten Thread ausführen muss - ich kann dann weiter überprüfen/auf das Vorhandensein des div warten, während die WebBrowser-Instanz weiterhin die URL lädt, die ich darum gebeten habe.

Meine Versuche dazu sind jedoch gescheitert und ich würde Wert darauf legen, wie ich darüber gehen sollte. Ich dachte, dass das Versenden eines neuen Threads mit new Thread(() => { Browser.Navigate(url); }); funktionieren würde, aber nachdem das getan wird, lädt nichts und der Browser.ReadyState bleibt als "Uninitialized". Ich gehe davon aus, dass ich falsch verstehe, wie man mit C# Verfahren richtig einfädeln kann und würde einen Ratschlag wertschätzen!

+0

Siehe [WebBrowser control = warten für das Laden der Seite zu vervollständigen] (http://social.msdn.microsoft.com/Forums/windows/en-US/9e5d265c-8771-433c-a2aa-91b4eeb1d684/webbrowser-control-wait-for-page-load-to -komplett in einer Baugruppe? Forum = winforms). Es heißt - rufen Sie 'System.Windows.Forms.Application.DoEvents()' auf. – Lijo

Antwort

5

Blockieren Sie nicht die Nachrichtenpumpe des Hauptfadens. Da der Browser eine STA-Komponente ist, kann xmlhttprequest keine Ereignisse aus dem Hintergrundthread auslösen, wenn Sie die Nachrichtenpumpe blockieren. Sie können nicht in einem Hintergrundthread navigieren. Der Windows Forms-Wrapper des Webbrowsers ActiveX unterstützt keinen Zugriff von anderen Threads als dem UI-Thread. Verwenden Sie stattdessen einen Timer.

+0

Können Sie bitte den Timer Ansatz erarbeiten? Können wir eine Verzögerung von 1 Sekunde hinzufügen, bevor das DocumentCompleted Event ausgelöst wird? – Lijo

+1

Nein, aber Sie können einen Timer starten und dann das Dokument in seinem Tick-Ereignis analysieren, vorausgesetzt, der Ajax-Vorgang wird beendet, bevor der Timer tickt. Denken Sie daran, den Timer zu stoppen, wenn Sie mit dem Parsen fertig sind. –

8

Die folgenden Arbeiten sollten

while (Browser.Document.GetElementById("divid") == null) 
{ 
    Application.DoEvents(); 
    Thread.Sleep(200); 
} 

Die oben für mich gearbeitet ...

+0

Ich experimentierte mit etwas Ähnlichem, aber am Ende benutzte Sheng Jiang's Methode. Es schien der "richtige" Weg zu sein, dies zu tun. – JoeR

+0

was ist, wenn das div nicht vollständig geladen ist? –

1

Sie einen Text in den Körper zum Beispiel finden:

while (HtmlWindow.Document.Body.InnerHtml.Contains(some_text) == false) 
{   
    Application.DoEvents(); 
    Thread.Sleep(200); 
}