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: 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 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 Browser.Navigater code> 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é à. P>
nouveau thread (() => {browser.navigate (URL);}); code> 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! P> P>
4 Réponses :
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. P>
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é.
Les éléments suivants doivent fonctionner,
while (Browser.Document.GetElementById("divid") == null) { Application.DoEvents(); Thread.Sleep(200); }
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?
Vous pouvez trouver un texte dans le corps par exemple:
Vous ne devez pas appeler Une meilleure solution consiste à créer une tâche asynchrone. À l'intérieur de cette tâche, vous pouvez appeler 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. P> 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: p> thread.sleep code> car il bloquera le thread de l'interface utilisateur.
task.delay code> qui n'interférera pas avec l'interface utilisateur. P>
Reportez-vous à WebBrowser Control = Attendez la charge de la page pour compléter . Il dit - appelez
system.windows.forms.application.devents () code>.