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

ASP.NET Discussion :

Fermeture de StreamReader prend beaucoup de temps?


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    DSI
    Inscrit en
    Mars 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : DSI

    Informations forums :
    Inscription : Mars 2006
    Messages : 28
    Par défaut Fermeture de StreamReader prend beaucoup de temps?
    Bonjour,

    J'utilise un StreamReader pour lire un flux de données volumineux (+ 5 MO).

    Mon problème est le temps que prend l'instruction streamReader.Close() pour se terminer (environ 10 minutes), sachant ue tout le traitement (initialisation du flux, lecture avec streamReader.Read(), et le traitement des données) ne me prend qu quelques secondes.

    voici un extrait de mon code :

    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
    33
     
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(analyserURL);
    string parameters = string.Format("mode={0}&wt={1}&terms={2}&text={3}", mode, "full", HttpUtility.UrlEncode(terms), HttpUtility.UrlEncode(xhtml));
     
     
    webRequest.Method = "POST";
    webRequest.ContentType = "application/x-www-form-urlencoded";
    webRequest.ContentLength = parameters.Length;
    webRequest.Timeout = timeout;
     
    using (Stream requestStream = webRequest.GetRequestStream())
      {
          requestStream.Write(Encoding.UTF8.GetBytes(parameters), 0, parameters.Length);
     
          HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
     
           using (StreamReader streamReader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8))
                        {
                            while (streamReader.Peek() != -1)
                            {
                                //string line = streamReader.ReadLine();
                                string line = ReadLineStream(streamReader); //une méthode qui boucle sur streamReader.read() jusqu'à saut de ligne
                               // traitement des données
                            }
     
    		        // streamReader.DiscardBufferedData();                       
    		        streamReader.Close();       //cette instruction prend 10 minutes pour se terminer               
                        }
     
                        webResponse.Close();
                        requestStream.Close();
     
      }
    Si j'enlève streamReader.close() (fermeture implicite par using), le problème reste le même du fait que le temps passé est reporté sur l'accolade de using.

    Merci de votre aide.

  2. #2
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Salut,

    Il ne faut pas utiliser une chaine pour stocker 5Mo de données. Ce n'est tout simplement pas prévu pour.

    Personnellement, je lis les données par petits blocs et je les écris immédiatement dans un fichier. C'est très rapide. Voici un exemple pour télécharger des fichiers sur un site FTP (écrire sur un site distant):
    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
    33
    34
    35
    36
    public static bool FtpUploadToServer(FileInfo fileInfo, Uri uri, NetworkCredential credentials)
    {
        try
        {
            FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(uri);
     
            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.Credentials = credentials;
            request.UseBinary = true;
            // Utilisé pour envoyer la commande "QUIT" au serveur afin de fermer correctement la connexion
            request.KeepAlive = false;
            // Taille du tableau servant à stocker les morceaux du fichier. On épargne ainsi les ressources du serveur en ne chargeant pas la totalité du fichier. Cela permet de transférer rapidement des fichiers volumineux.
            int buffSize = 2048;
            byte[] buffer = new byte[buffSize];
            // Variable de mesure de la taille du morceau de fichier lu. Permet d'indiquer que le fichier a été lu et écrit en totalité.
            int block;
     
            using (FileStream fs = File.OpenRead(fileInfo.FullName))
            {
                block = fs.Read(buffer, 0, buffSize);
                using (Stream stream = request.GetRequestStream())
                {
                    while (block != 0)
                    {
                        stream.Write(buffer, 0, buffSize);
                        block = fs.Read(buffer, 0, buffSize);
                    }
                }
            }
        }
        catch
        {
            return false;
        }
        return true;
    }
    Un autre exemple (juste le bout de code interessant) pour télécharger un fichier localement:
    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
    using (FtpWebResponse res = (FtpWebResponse)req.GetResponse())
    {
        using (Stream resin = res.GetResponseStream())
        {
            using (StreamReader rea = new StreamReader(resin))
            {
                using (StreamWriter wr = new StreamWriter(fLocalPath.FullName))
                {
                    while (!rea.EndOfStream)
                    {
                        wr.Write(rea.ReadLine().Trim() + "\r\n");
                    }
                }
            }
        }
    }
    Tu n'as plus qu'à transposer

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

Discussions similaires

  1. [2008R2] script qui prend beaucoup de temps
    Par my_diva dans le forum Développement
    Réponses: 7
    Dernier message: 20/01/2014, 17h48
  2. Extraction qui prend beaucoup de temps
    Par khadija30 dans le forum SSIS
    Réponses: 14
    Dernier message: 14/05/2013, 17h12
  3. Liaison de donnée à combobox prend beaucoup de temps.
    Par Sankasssss dans le forum VB.NET
    Réponses: 19
    Dernier message: 07/01/2011, 20h02
  4. Réponses: 7
    Dernier message: 10/03/2009, 19h02
  5. do while prend beaucoup de temps
    Par bailamos dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 21/07/2008, 22h58

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