IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Lecture de Flux directement depuis un StreamReader [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 73
    Par défaut Lecture de Flux directement depuis un StreamReader
    Bonjour,

    J'ai un souci lors de l'utilisation de l'objet StreamReader durant le téléchargement du contenu HTML d'une page Web,

    En fait le code en bas ne s’exécute correctement que si je temporise l’exécution du programme, Que ce soit par la ligne commentée ou via un MsgBox dans la boucle qui nécessite un click humain donc du temps,

    J'ai comme l’impression que lors d'une boucle rapide, Le téléchargement de la page n'est pas complet et je me trouve avec des donnée du milieu de la page, Contrairement après une temporisation je reçoit le dernier de la page qui inclut la balise de fin de la page web à savoir </html>


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    Public Class Form1
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
            Dim objWebRequest As System.Net.WebRequest = System.Net.HttpWebRequest.Create("http://www.SiteQuelconque.net")
     
            Dim objWebResponse As System.Net.WebResponse = objWebRequest.GetResponse()
     
            Dim objStreamReader As New System.IO.StreamReader(objWebResponse.GetResponseStream())
     
            Dim c(1024) As Char
     
            Do While objStreamReader.Peek() >= 0
     
                objStreamReader.Read(c, 0, c.Length)
     
                'System.Threading.Thread.Sleep(1000)
     
            Loop
     
            MsgBox(c)
     
            objStreamReader.Close()
            objWebResponse.Close()
     
        End Sub
     
    End Class
    Mon besoin été d'éviter les méthodes "ReadLine" et "ReadToEnd" qui prennent énormément de temps d’exécution surtout avec les pages long,

    Merci de m'expliquer ce constat SVP ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Bah c'est normal, tu lis les données en boucle par blocs de 1024 octets, donc à chaque passage les données lues précédemment sont écrasées dans ton tableau, et à la fin il ne reste que les données qui sont tout à la fin.

    Mon besoin été d'éviter les méthodes "ReadLine" et "ReadToEnd" qui prennent énormément de temps d’exécution surtout avec les pages long,
    C'est pas plus long que de lire tout le flux dans une boucle comme tu fais... Si tu veux récupérer le document complet, ReadToEnd est clairement la meilleure solution

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 73
    Par défaut
    Bonjour,

    Merci de votre retour,

    Effectivement j’écrase les donnée, Mais le problème c'est que je ne trouve pas les données relatives au pied de la page à savoir le </html>, (Qui m’intéresse),

    Je pense que je vais utiliser ReadToEnd pour le moment, Mais l’exécution de cette boucle "Read" est vraiment très rapide par rapport à "ReadToEnd", Mais mon souci c'est que je récupère pas tout le flux,

    Mon besoin c'était de boucler tout le flux pour arriver à la fin qui m'interesse, J'ai opté cette solution parce que je n'ai pas réussi à se possitionner dans le Flux, J'arrive pas à utiliser les méthodes BaseStream (Seek, Peek, ...)!

    Quelque chose d'étrange ce passe... Si quelqu'un peut tester vite fait ce code il pourra l’apercevoir,

    Merci encore,

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par compte Voir le message
    l’exécution de cette boucle "Read" est vraiment très rapide par rapport à "ReadToEnd"
    Euh, t'es sûr ? Je vois pas trop pourquoi ce serait plus rapide, vu que dans les deux cas tu lis tout le flux. Le seul overhead de ReadToEnd, c'est qu'il doit allouer de la mémoire pour une chaine de plus en plus grande, mais en comparaison du temps de transfert des données sur le réseau, c'est assez négligeable.


    Citation Envoyé par compte Voir le message
    Mon besoin c'était de boucler tout le flux pour arriver à la fin qui m'interesse, J'ai opté cette solution parce que je n'ai pas réussi à se possitionner dans le Flux, J'arrive pas à utiliser les méthodes BaseStream (Seek, Peek, ...)!
    Normal, le ResponseStream d'une requête HTTP n'est pas "seekable" (ce qui est assez logique : tu ne peux pas te déplacer vers la fin du flux alors que tu n'as pas encore téléchargé les données jusqu'à la fin)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 73
    Par défaut
    Bonjour,

    Merci infiniment pour vos retours, C'est noté,

    Pour vous confirmez la durée d’exécution, Je viens de refaire le test ci-dessous, Une Form avec 2 Buttons, La requête avec Read s’exécute dans 538 ms, Tandis que celle avec ReadToEnd dure 11344 ms,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
     
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim objWebRequest As System.Net.WebRequest = System.Net.HttpWebRequest.Create("http://www.SiteQuelconque.com")
            Dim objWebResponse As System.Net.WebResponse = objWebRequest.GetResponse()
            Dim objStreamReader As New System.IO.StreamReader(objWebResponse.GetResponseStream())
            Dim c(1024) As Char
            Dim monSWtest1 As New Stopwatch
            monSWtest1.Start()
            objStreamReader.ReadToEnd()
            monSWtest1.Stop()
            MsgBox(monSWtest1.ElapsedMilliseconds.ToString & " milliseconde(s)")
            objStreamReader.Close()
            objWebResponse.Close()
            Me.Close()
        End Sub
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim objWebRequest As System.Net.WebRequest = System.Net.HttpWebRequest.Create("http://www.SiteQuelconque.com")
            Dim objWebResponse As System.Net.WebResponse = objWebRequest.GetResponse()
            Dim objStreamReader As New System.IO.StreamReader(objWebResponse.GetResponseStream())
            Dim c(1024) As Char
            Dim monSWtest1 As New Stopwatch
            monSWtest1.Start()
            Do While objStreamReader.Peek() >= 0
                objStreamReader.Read(c, 0, c.Length)
            Loop
            monSWtest1.Stop()
            MsgBox(monSWtest1.ElapsedMilliseconds.ToString & " milliseconde(s)")
            objStreamReader.Close()
            objWebResponse.Close()
            Me.Close()
        End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme de lecture d'un flux XML depuis une URL
    Par euyeusu dans le forum ASP
    Réponses: 3
    Dernier message: 10/09/2008, 22h01
  2. lecture de flux video dans borderLayout.CENTER
    Par Dsphinx dans le forum Multimédia
    Réponses: 5
    Dernier message: 04/08/2006, 17h30
  3. [ThunderBird] Refuse de lire les flux RSS depuis 3jours
    Par Swoög dans le forum Thunderbird
    Réponses: 4
    Dernier message: 27/06/2006, 21h33
  4. [Audio] Enregistrement et lecture de flux...
    Par remixtech dans le forum Langage
    Réponses: 2
    Dernier message: 29/10/2005, 12h07
  5. Erreur de lecture du flux sous SQLServer
    Par smazaudi dans le forum Bases de données
    Réponses: 4
    Dernier message: 29/03/2005, 14h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo