Warten WebBrowser ajax-content
Möchte ich zum anhalten der Ausführung der meinen thread bis zu einem bestimmten div geladen wurde via ajax in einem WebBrowser-Instanz. Natürlich kann ich ständig prüfen, ob die Anwesenheit dieses div etwas wie:
while (Browser.Document.GetElementById("divid") == null) { Thread.Sleep(200); }
Jedoch schläft der thread, der Browser ist in zwischen-Schleifen blockiert nur den browser tatsächlich das laden der Inhalte in den ersten Platz. Es scheint, daher, dass ich brauchen, um ausführen die Browser.Navigate
- Methode in einem separaten thread, kann ich dann weiterhin zu prüfen/warten, bis die Präsenz des div-während die WebBrowser-Instanz weiterhin das laden der URL, fragte ich ihn.
Meine versuche, diese jedoch versagt haben, und ich möchte den Wert eine Eingabe auf, wie sollte ich dies angehen. Ich dachte einfach er einen neuen thread mit new Thread(() => { Browser.Navigate(url); });
arbeiten würde, aber nach dem tun so, nichts wird geladen und der Browser.ReadyState bleibt als 'nicht initialisiert'. Ich nehme an, ich bin Missverständnis, wie man richtig einfädeln Verfahren, wie dies mit C# und würde Wert einige Ratschläge!
- Siehe WebBrowser-control = warten Sie, bis die Seite geladen ist abgeschlossen. Es sagt - call
System.Windows.Forms.Application.DoEvents ()
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Blockieren Sie nicht den Haupt-thread die Nachricht der Pumpe. Da der browser ein STA-Komponente, xmlhttprequest nicht in der Lage, Ereignisse aus dem hintergrund-thread, wenn Sie die Nachricht blockieren, Pumpe.
Sie können nicht navigieren in einem hintergrund-thread. Die Windows Forms wrapper der das webbrowser-ActiveX unterstützt nicht den Zugriff von anderen threads als UI-thread. Verwenden Sie einen timer, statt.
Folgende arbeiten sollten,
Den oben genannten für mich gearbeitet...
Finden Sie einen text, in Körper-zum Beispiel:
Sollten Sie nicht nennen
Thread.Sleep
wie es blockiert den UI thread.Eine bessere Lösung ist das erstellen einer asynchronen Aufgabe. Innerhalb dieser Aufgabe, die Sie anrufen können
Task.Delay
die nicht stören, mit der UI.Den code oben überprüft die DOM-alle 200 Millisekunden, um zu sehen, wenn das element mit der angegebenen ID existiert. Es enthält auch ein Zeitlimit (z.B. 10 Sekunden) im Falle das element wird nie geladen, keine unerwarteten Grund.
Hier ist ein Beispiel zeigt, wie diese Funktion verwenden, um Lesen Sie den Wert aus einem Textfeld in das Dokument aufgenommen, nachdem ein AJAX-Aufruf: