J'ai une boucle pour la boucle: J'ai trouvé ce , cependant: p> Y a-t-il un moyen d'attendre pendant une boucle? p> p> Webb code> est un contrôle WebBrowser et
i code> est un int. p> < P> Je veux attendre que le navigateur ait fini de naviguer. P>
Void code>, comme suggéré dans Cette réponse li>
ul>
7 Réponses :
Pour attendre dans un fil, vous pouvez faire quelque chose comme ça
System.Threading.Thread.Sleep(2000); //waits 2 seconds
Cela bloquera la navigation, qui nécessite le thread d'hébergement du contrôle WebBrowser pour pomper des messages en temps utile.
Vous n'êtes pas obligé d'utiliser une autre fonction code> annulation code>. Utilisez simplement un lambda code> comme:
En supposant que votre hôte WebBrowser code> Dans une application WinFroms, vous pouvez le faire dans une boucle facilement et efficacement, en utilisant
async / attendre code> motif. Essayez ceci:
void Form_Load(object sender, EventArgs e)
{
var task = DoNavigationAsync();
task.ContinueWith((t) =>
{
MessageBox.Show("Navigation done!");
}, TaskScheduler.FromCurrentSynchronizationContext());
}
Pouvez-vous expliquer ce qui se passe avec la tâche lorsque ces si b> S dans DocumentPompletd B> Handler se font frapper? Le gestionnaire DocumentCompletd) est-il mouillé à plusieurs reprises?
@Xeme Oui, il peut être tiré plusieurs fois, par exemple Pour un document avec iframes code>. Je me souviens que j'ai couvert que, dans plus de détails ailleurs, si vous avez intéressé à mes autres réponses avec
WebBrowser-Control code> tag.
J'ai essayé d'implémenter une impression silencieuse à mon application WinForms. Je pris l'autre réponse ( Stackoverflow.com/Questtions/19734151/... ) comme base. Pourtant, j'ai toujours reçu un navigateur Web dans une préparation préalable non initialisée. Quelle pourrait être la raison?
@lexeme, voulez-vous dire que le code exemple de cette réponse ne fonctionne pas pour vous, de même que?
NOeratio, pour une raison quelconque, oui, cela ne fonctionne pas tel quel. J'essaie d'imprimer un document PDF, peut-être qu'il y a quelque chose à voir avec les paramètres de sécurité IE IDK. WebBrowser reste dans l'état prête non initialisé.
J'ai utilisé l'ensemble Doworkasync () code> tel quel.
@lexeme, je vois, cela ne fonctionnera pas pour les PDF, uniquement pour HTML.
NOeratio, que puis-je faire avec pdf? Je sais que je peux m'en tenir à Adobe Reader (nous l'utilisons déjà) Appel de processus.Mais, je pensais qu'il serait plus agréable de le faire avec WebBrowser dans certaines catégories de services publics.
@lexeme, j'ai une expérience très limitée avec l'hébergement de PDF à l'intérieur de Webbrowser, mais je ne pense pas qu'il soit possible d'automatiser l'impression PDF de cette façon. Vous serez peut-être mieux avec CEFSHARP (je n'ai pas moi-même utilisé).
La manière appropriée est d'utiliser des événements.
Dans votre boucle, comment pouvez-vous savoir que la navigation s'est terminée? Peut-être que vous êtes hors de la boucle, mais c'est à mi-chemin ...
aussi, en boucle en attendant s'appelle Occupé en attente et est CPU cher .
Pour être notifié Lorsque la page est prête et que, dans l'intervalle, gardez la CPU disponible pour d'autres éléments, utilisez des événements comme @jashaszun suggéré: P>
void YourFunction() { //Do stuff... webB.DocumentCompleted += (sender, e) => { //Code in here will be triggered when navigation is complete and document is ready }; webB.Navigate(URL); //Do more stuff... }
Essayez d'utiliser des tâches telles que ceci: espoir que j'ai aidé. p> p>
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load WebBrowser1.Navigate("stackoverflow.com/") End Sub Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted ------yourcode------ End Sub End Class
Utilisez ceci tandis que la boucle à l'intérieur de la boucle pour la boucle.
while (webB.ReadyState != tagREADYSTATE.READYSTATE_COMPLETE) { Thread.Sleep(500); }
Qu'est-ce qui est mauvais dans cette réponse? Stackoverflow.com/a/956020/1714342
@wudzik Les commentaires affirment que c'est une très ressource intensive sur votre CPU pendant que cela se passe.
Chaque solution sans événement terminé (meilleur) serait intensive de la CPU, essayez peut-être d'utiliser
thread.sleep code>?
@wudzik oh, ça le ferait? Ok, merci pour la suggestion.
Oui, vous serez coincé dans la boucle et vous ferez des trucs (toutes choses), il doit affecter la CPU.
Minic, vous voudrez avoir une seconde boucle qui vérifie pour voir si la préreyState de votre contrôle Web n'est pas encore terminée, et à l'intérieur de la boucle, appelez simplement
thread.sleep (50); code> pour un 50 milliseconde retard entre les chèques.