7
votes

Puis-je attendre qu'un webbrowser ait fini de naviguer, en utilisant une boucle?

J'ai une boucle pour la boucle: xxx

Webb est un contrôle WebBrowser et i est un int. < P> Je veux attendre que le navigateur ait fini de naviguer.

J'ai trouvé ce , cependant:

  • Je ne veux utiliser aucune API ou Addins
  • Je ne peux pas utiliser une autre fonction Void , comme suggéré dans Cette réponse

    Y a-t-il un moyen d'attendre pendant une boucle?


6 commentaires

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 ?


@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); pour un 50 milliseconde retard entre les chèques.


7 Réponses :


0
votes

Pour attendre dans un fil, vous pouvez faire quelque chose comme ça

 System.Threading.Thread.Sleep(2000); //waits 2 seconds


1 commentaires

Cela bloquera la navigation, qui nécessite le thread d'hébergement du contrôle WebBrowser pour pomper des messages en temps utile.



2
votes

Vous n'êtes pas obligé d'utiliser une autre fonction annulation . Utilisez simplement un lambda comme: xxx


0 commentaires

7
votes

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


9 commentaires

Pouvez-vous expliquer ce qui se passe avec la tâche lorsque ces si S dans DocumentPompletd 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 . 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 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 () 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é).



1
votes

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


0 commentaires

0
votes

Essayez d'utiliser des tâches telles que ceci: xxx

espoir que j'ai aidé.


0 commentaires

0
votes
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

0 commentaires

1
votes

Utilisez ceci tandis que la boucle à l'intérieur de la boucle pour la boucle.

while (webB.ReadyState != tagREADYSTATE.READYSTATE_COMPLETE)
            {
               Thread.Sleep(500);
            }


0 commentaires