D'attente pour WebBrowser contenu ajax
Je veux mettre en pause l'exécution de mon fils jusqu'à ce qu'un particulier div a été chargé via ajax dans un WebBrowser instance. Évidemment, je peux vérifier en continu la présence de cette div en faisant quelque chose comme:
while (Browser.Document.GetElementById("divid") == null) { Thread.Sleep(200); }
Cependant, le sommeil le thread que le Navigateur est en entre les boucles que bloque le navigateur de charger le contenu dans la première place. Il semble, donc, que j'ai besoin pour exécuter le Browser.Navigate
méthode dans un thread séparé - je peux alors continuer à vérifier/attendez que la présence de la div, tandis que le WebBrowser instance continue à charger l'URL que j'ai demandé de le faire.
Mes tentatives de cela, cependant, ont échoué et j'avais de la valeur de l'entrée sur comment je devrais aller à ce sujet. Je pensais simplement l'envoi d'un nouveau thread avec new Thread(() => { Browser.Navigate(url); });
pourrait fonctionner, mais après cela, rien de charges et le Navigateur.ReadyState reste comme "non Initialisé". Je suppose que je ne suis malentendu comment le faire correctement le filetage des procédures comme ça avec C# et serait la valeur de quelques conseils!
System.Windows.Forms.Application.DoEvents ()
.
OriginalL'auteur JoeR | 2010-09-25
Vous devez vous connecter pour publier un commentaire.
Ne pas bloquer le thread principal message de la pompe. Depuis le navigateur est un composant STA, xmlhttprequest ne sera pas en mesure de déclencher des événements de la thread d'arrière-plan si vous bloquez le message de la pompe.
Vous ne pouvez pas naviguer dans un thread d'arrière-plan. Les Windows Forms wrapper de l'ActiveX webbrowser ne prend pas en charge l'accès à partir d'autres threads que le thread d'INTERFACE utilisateur. Utilisez une minuterie à la place.
Non, mais vous pouvez starter une minuterie ensuite d'analyser le document dans son événement tick, en supposant que l'opération ajax se termine avant que la minuterie de tiques. N'oubliez pas de l'arrêt de la minuterie lorsque vous avez terminé l'analyse.
OriginalL'auteur Sheng Jiang 蒋晟
La suivante devrait fonctionner,
Ci-dessus a fonctionné pour moi...
que faire si la div pas complètement chargé?
OriginalL'auteur Ponson
Vous pouvez trouver un texte dans le corps par exemple:
OriginalL'auteur Federico Aineseder
Vous ne devez pas appeler
Thread.Sleep
comme il va bloquer le thread d'INTERFACE utilisateur.Une meilleure solution est de créer une tâche asynchrone. À l'intérieur de cette tâche vous pouvez appeler
Task.Delay
qui n'interfère pas avec l'INTERFACE utilisateur.Le code ci-dessus vérifie les DOM, tous les 200 millisecondes pour voir si l'élément avec l'ID donné existe. Il contient également un délai d'attente (par exemple 10 secondes) dans le cas où l'élément n'est jamais chargé pour toutes les raisons imprévues.
Voici un exemple montrant comment utiliser cette fonction pour lire la valeur d'un champ de texte ajouté au document après un appel AJAX:
OriginalL'auteur Duncan Luk