Question

J'ai un contrôle WebBrowser qui est instancié dynamiquement à partir d'un thread STA fond parce que le thread parent est un BackgroundWorker et a beaucoup d'autres choses à faire.

Le problème est que l'événement ne se déclenche Navigated, à moins que je pop un MessageBox.Show () dans la méthode qui a dit à .Navigate (). Je vais vous expliquer:

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

Cela fonctionne bien; mais le messagebox va prendre le chemin puisque c'est une application d'automatisation. Lorsque je retire la MessageBox.Show (), l'événement WebBrowser.Navigated ne se déclenche. J'ai essayé supplantant cette ligne avec un Thread.Sleep (), et en suspendant le thread parent.

Une fois que je reçois ce hors du chemin, je l'intention de suspendre le fil parent alors que le WebBrowser fait son travail et trouver un moyen de passer le code HTML résultant sur le fil de parent afin qu'il puisse continuer avec la logique plus loin.

Pourquoi fait-il cela? Comment puis-je résoudre ce problème?

Si quelqu'un peut me fournir un moyen de récupérer le contenu d'une page Web, remplissez certaines données, et retourner le contenu de la page de l'autre côté du bouton soumettre, tous contre un serveur web qui ne supporte pas verbes POST, ni les données passant par QueryString, je vais aussi accepter cette réponse que cet exercice aura été inutile.


Solution: J'ai fini juste ne pas utiliser le fil BackgroundWorker et esclave du tout à la suggestion de l'architecte de l'équipe ... Bien au détriment de la réactivité: (

Était-ce utile?

La solution

WebBrowser ne fera pas beaucoup moins qu'il ne soit et a un thread d'interface utilisateur associée; vous montrant la forme sur laquelle il se trouve? Vous devez, d'utiliser les DOM, etc. Le formulaire pourrait être hors de l'écran si vous ne voulez pas l'afficher à l'utilisateur, mais il ne fonctionne pas bien dans un service (par exemple).

Pour des fins de grattage, vous pouvez normalement simuler un browwser régulier HTML en utilisant etc. WebClient est-ce pas suffisant? Vous pouvez utiliser des outils tels que « Fiddler » pour enquêter sur la demande exacte que vous devez faire au serveur. Pour plus de cela, vous pouvez regarder le HTML Agilité pack , qui offre un accès DOM HTML sans navigateur.

Autres conseils

Les événements et DocumentComplete naviguais dans le feu ne seront pas si la visibilité du navigateur Web est définie sur false. Vous pouvez contourner cette limitation en rendant le WebBrowser visible, mais la mise en son emplacement pour qu'il soit en dehors de l'interface utilisateur comme:

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

vous devez ajouter une ligne qui est comme ceci:

webBrowser1.Navigated += new WebBrowserNavigatedEventHandler(webBrowser1_Navigated);

où est la fonction webBrowswer1_Navigated vous voulez appeler lorsque l'événement se déclenche.

Y at-il un fil GUI déjà commencé? Peut-être l'objet WebBrowser utilise un thread GUI pour gérer les événements. Dans ce cas, vous devez appeler Application.Run () du fil qui crée le navigateur Web (remplacer MessageBox.Show () à ce sujet). Application.Run () se bloque jusqu'à ce que Application.Exit () est appelée.

Essayer de tester maintenant.

J'ai fini juste ne pas utiliser le fil BackgroundWorker et esclave du tout à la suggestion de l'architecte de l'équipe ... Bien au détriment de la réactivité :(

Un contrôle WebBrowser ne peut pas fonctionner si elle n'est pas dans un thread STA. Si vous souhaitez utiliser une instance WebBrowser dans un fil dont vous avez besoin pour créer votre fil et appel Thread.SetApartmentState(ApartmentState.STA);

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top