10
votes

En attente de contenu WebBrowser Ajax

Je veux mettre en pause l'exécution de mon thread jusqu'à ce qu'un div des DIV soit chargé via AJAX dans une instance WebBrowser. Évidemment, je peux vérifier en permanence la présence de cette div fais quelque chose comme: xxx

Toutefois, dormant le fil que le navigateur se trouve entre les boucles bloque uniquement le navigateur de chargement du contenu de la première. endroit. Il semble donc que j'ai besoin d'exécuter le Browser.Navigater dans un thread séparé - je peux continuer à vérifier / attendre la présence de la DIV tandis que l'instance WebBrowser continue de charger l'URL i Demandé à.

Mes tentatives à cela, cependant, ont échoué et j'établirais toute entrée sur la manière dont je devrais y aller. Je pensais simplement envoyer un nouveau thread avec nouveau thread (() => {browser.navigate (URL);}); fonctionnerait mais après cela, rien ne se charge, rien ne reste de charges et le navigateur. Non initialisé '. Je présume que je suis mal compris que de savoir comment faire de manière appropriée des procédures telles que celles-ci avec C # et valoriserait des conseils!


1 commentaires

Reportez-vous à WebBrowser Control = Attendez la charge de la page pour compléter . Il dit - appelez system.windows.forms.application.devents () .


4 Réponses :


6
votes

Ne bloquez pas la pompe de message du fil principal. Étant donné que le navigateur est un composant STA, XMLHTTPQUEST ne pourra pas soulever des événements à partir du fil d'arrière-plan si vous bloquez la pompe de message. Vous ne pouvez pas naviguer dans un fil d'arrière-plan. Les Windows formulaires Wrapper du WebBrowser ActiveX ne prend pas en charge l'accès des autres threads que le fil de l'interface utilisateur. Utilisez une minuterie à la place.


2 commentaires

Pouvez-vous s'il vous plaît élaborer l'approche minuterie? Peut-on ajouter un délai de 1 seconde avant de tirer l'événement DocumentPomplet?


Non, mais vous pouvez commencer une minuterie puis analyser le document dans son événement de tiques, en supposant que l'opération AJAX se termine avant que les tiques de la minuterie. N'oubliez pas d'arrêter la minuterie lorsque vous avez terminé.



7
votes

Les éléments suivants doivent fonctionner,

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


2 commentaires

J'ai expérimenté quelque chose de similaire, mais à la fin, j'ai utilisé la méthode de Sheng Jiang. Il semblait être le moyen le plus «correct» de le faire.


Et si la Div n'est pas complètement chargée?



0
votes

Vous pouvez trouver un texte dans le corps par exemple: xxx


0 commentaires

0
votes

Vous ne devez pas appeler thread.sleep car il bloquera le thread de l'interface utilisateur.

Une meilleure solution consiste à créer une tâche asynchrone. À l'intérieur de cette tâche, vous pouvez appeler task.delay qui n'interférera pas avec l'interface utilisateur. xxx

Le code ci-dessus vérifie le DOM tous les 200 millisecondes à Voir si l'élément avec l'identifiant donné existe. Il contient également un délai d'attente (par exemple 10 secondes) au cas où l'élément ne devient jamais chargé pour une raison inattendue.

Voici un exemple indiquant comment utiliser cette fonction pour lire la valeur d'un champ de texte ajouté à Le document après un appel Ajax: xxx


0 commentaires