Domanda

Ho un controllo WebBrowser che viene creata un'istanza dinamicamente da un thread in background STA perché il thread genitore è un BackgroundWorker e ha un sacco di altre cose da fare.

Il problema è che l'evento non si attiva mai Navigated, a meno che non ho pop un MessageBox.Show () nel metodo che ha detto di .Navigate (). Spiegherò:

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

Questo funziona bene; ma il MessageBox sarà ottenere nel modo in quanto questo è un app di automazione. Quando rimuovo il MessageBox.Show (), l'evento WebBrowser.Navigated non si attiva mai. Ho provato soppiantare questa linea con un Thread.Sleep (), e sospendendo il filo genitore.

Una volta che ho questo fuori del modo, ho intenzione di sospendere il filo genitore, mentre il browser web sta facendo il suo lavoro e trovare il modo di passare il codice HTML risultante torna al thread genitore modo che possa continuare con l'ulteriore logica.

Perché fare questo? Come posso risolvere il problema?

Se qualcuno mi può fornire un modo per recuperare il contenuto di una pagina web, compilare alcuni dati, e restituire il contenuto della pagina sull'altro lato del pulsante di invio, tutti contro un server web che non supporta verbi POST, né il passaggio di dati via QueryString, io accetto anche che la risposta nel suo complesso questo esercizio sarà stato inutile.


Soluzione: Ho finito appena non si utilizza il filo BackgroundWorker e slave a tutti su suggerimento dell'architetto squadra ... anche se a scapito di risposta: (

È stato utile?

Soluzione

WebBrowser non farà molto meno che non sia indicato e ha un thread UI associata; stai mostrando la forma in cui risiede? È necessario, per usare il DOM ecc Il modulo potrebbe essere off-screen, se non si desidera visualizzare all'utente, ma non funziona bene in un servizio (per esempio).

Ai fini raschiare, normalmente è possibile simulare un browwser HTML regolari utilizzando WebClient ecc questo non è sufficiente? È possibile utilizzare strumenti come " Fiddler " per indagare la richiesta esatto avete bisogno per rendere al server. Per di più, si potrebbe guardare il HTML Agility pacchetto , che offre l'accesso DOM HTML senza browser.

Altri suggerimenti

Gli eventi Navigated e DocumentComplete non spareranno se la visibilità del browser web è impostata su false. È possibile aggirare questa limitazione, rendendo il browser web visibile ma impostando la sua posizione in modo che sia al di fuori dell'interfaccia utente come:

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

è necessario aggiungere una linea che è come questo:

webBrowser1.Navigated += new WebBrowserNavigatedEventHandler(webBrowser1_Navigated);

dove webBrowswer1_Navigated è la funzione che si desidera chiamato quando viene generato l'evento.

C'è un filo GUI già iniziato? Forse l'oggetto WebBrowser utilizza un thread GUI per gestire gli eventi. In tal caso, si dovrebbe chiamare Application.Run () dal thread che crea il browser web (sostituire la MessageBox.Show () con questo). Application.Run () si bloccherà fino Application.Exit () è chiamato.

Cercando di verificare questa ora.

Ho finito appena non si utilizza il filo BackgroundWorker e slave a tutti su suggerimento dell'architetto squadra ... anche se a scapito di reattività :(

Un controllo WebBrowser non può funzionare se non è in un thread STA. Se si desidera utilizzare un'istanza del browser web in un thread è necessario creare il tuo thread e la chiamata Thread.SetApartmentState(ApartmentState.STA);

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top