Frage

Ich habe ein WebBrowser-Steuerelement, das dynamisch von einem Hintergrund STA-Thread instanziiert wird, weil das Muttergewinde ein Background ist und hat viele andere Dinge zu tun.

Das Problem ist, dass das navigierte Ereignis nie ausgelöst, es sei denn, ich MessageBox.Show () in der Methode Pop, die ihm zu .Navigate gesagt (). Ich werde erklären:

ThreadStart ts = new ThreadStart(GetLandingPageContent_ChildThread);
Thread t = new Thread(ts);
t.SetApartmentState(ApartmentState.STA);
t.Name = "Mailbox Processor";
t.Start();

protected void GetLandingPageContent_ChildThread()
{
 WebBrowser wb = new WebBrowser();
 wb.Navigated += new WebBrowserNavigatedEventHandler(wb_Navigated);
 wb.Navigate(_url);
 MessageBox.Show("W00t");
}

protected void wb_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
 WebBrowser wb = (WebBrowser)sender; // Breakpoint
 HtmlDocument hDoc = wb.Document;
}

Das funktioniert gut; aber die messagebox wird in die Quere kommen, da dies eine Automatisierung App ist. Als ich die MessageBox.Show () zu entfernen, löst das WebBrowser.Navigated Ereignis nie. Ich habe versucht, diese Zeile mit einem Thread.Sleep verdrängend () und durch den übergeordneten Thread suspendiert wird.

Wenn ich diese aus dem Weg zu bekommen, will ich den übergeordneten Thread Suspend während des WebBrowser tut seine Arbeit und in gewisse Weise von dem mir ergebende HTML zurück an das Muttergewinde finden, so dass es mit weiterer Logik fortgesetzt werden kann.

Warum es das tun? Wie kann ich das Problem beheben?

Wenn jemand kann mir eine Möglichkeit bieten, den Inhalt einer Web-Seite zu holen, füllt einige Daten aus, und gibt den Inhalt der Seite auf der anderen Seite des Submit-Button, alle gegen einen Webserver, die nicht unterstützt POST Verben noch Daten über Abfrage-Zeichenfolge vorbei, ich werde auch diese Antwort als diese ganze Übung akzeptieren unnötigen haben.


Lösung: Ich landete einfach nicht die Background und Slave-Thread überhaupt auf Anregung des Teams Architekt ... Obwohl auf Kosten der Reaktions verwendet: (

War es hilfreich?

Lösung

WebBrowser wird nicht viel tun, wenn nachgewiesen wird, und hat eine UI-Thread zugeordnet ist; auf denen zeigen Sie das Formular es sich befindet? Sie müssen, könnte das DOM usw., das Formular zu verwenden, Off-Screen, wenn Sie es den Benutzer nicht angezeigt werden sollen, aber es wird in einem Service (zum Beispiel) nicht gut funktionieren.

Für die Zwecke Schaben können Sie in der Regel einen normalen HTML-browwser simulieren mit WebClient usw. ist dies nicht ausreichend? Sie können Tools wie „ Fiddler “ die genaue Anforderung zum Server machen müssen, untersuchen. Für mehr als das, könnte man sich den HTML Agility Pack-, die ohne einen DOM Zugriff auf HTML bietet Browser.

Andere Tipps

Die navigierte und Document Ereignisse werden nicht ausgelöst, wenn die Sichtbarkeit des Web-Browsers auf false gesetzt ist. Sie können, indem sie der WebBrowser sichtbar um diese Einschränkung zu umgehen, aber Einstellung seiner Lage so, dass sie außerhalb der Benutzeroberfläche wie ist:

wb.Visible = true;
wb.Left = -wb.Width; // notice the minus sign

Sie müssen eine Zeile hinzufügen, die wie folgt ist:

webBrowser1.Navigated += new WebBrowserNavigatedEventHandler(webBrowser1_Navigated);

wo webBrowswer1_Navigated ist die Funktion, die Sie genannt werden sollen, wenn das Ereignis ausgelöst wird.

Gibt es einen GUI-Thread bereits begonnen? Vielleicht ist das WebBrowser-Objekt verwendet ein GUI-Thread-Ereignisse zu behandeln. In diesem Fall sollten Sie Application.Run () aus dem Thread aufrufen, die die Web-Browsers (ersetzen Sie MessageBox.Show () mit diesem) erzeugt. Application.Run () wird bis Application.Exit () hängen aufgerufen.

Der Versuch, dies jetzt zu testen.

ich am Ende einfach nicht die Background und Slave-Thread mit überhaupt auf Anregung des Teams Architekt ... Obwohl auf Kosten der Reaktions :(

Ein WebBrowser-Steuerelement kann nicht funktionieren, wenn es nicht in einem STA-Thread ist. Wenn Sie eine Web-Browser-Instanz in einem Thread verwenden müssen Sie Ihren Faden und Anruf Thread.SetApartmentState(ApartmentState.STA);

erstellen
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top