2013-04-30 4 views
-1

Nous essayons d'identifier l'utilisation élevée du processeur dans les services dont nous disposons, et nous pensons qu'il existe quelques zones potentielles susceptibles de provoquer des boucles infinies. Voici un code qui, selon nous, pourrait causer une boucle infinie. Y a-t-il quelque chose de spécifique qui pourrait faire tourner la boucle while indéfiniment?Boucle infinie possible lors de la diffusion de la réponse

  WebRequest request = WebRequest.Create(Url); 
      request.ContentLength = formDataLength; 
      request.ContentType = "application/x-www-form-urlencoded"; 
      request.Method = "POST"; 

      using (Stream rs = request.GetRequestStream()) 
      { 
       ASCIIEncoding encoding = new ASCIIEncoding(); 
       var postData = encoding.GetBytes(formData); 
       rs.Write(postData, 0, postData.Length); 

       string str = string.Empty; 
       using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
       { 
        using (Stream sm = response.GetResponseStream()) 
        { 
         int totalBytesRead = 0; 
         long responseBytesToRead = 1024; 
         byte[] buffer = new byte[responseBytesToRead]; 
         int bytesRead; 
         do 
         { 
          bytesRead = sm.Read(buffer, totalBytesRead, (int)(responseBytesToRead - totalBytesRead)); 
          totalBytesRead += bytesRead; 
         } while (totalBytesRead < bytesRead); 

         request.Abort(); 
         str = Encoding.Default.GetString(buffer); 
        } 
       } 
       return str; 
      } 
+0

vous n'êtes pas en utilisant la ([classe WebClient] http://msdn.microsoft.com/en -us/library/system.net.webclient.aspx)? L'utiliser raccourcirait votre code à 4-5 lignes. – dtb

Répondre

1

De la documentation MSDN:

Valeur de retour
Type: System.Int32 Le nombre total d'octets lus dans le tampon. Cela peut être inférieur au nombre d'octets requis si que beaucoup d'octets ne sont pas actuellement disponibles, ou zéro (0) si la fin de le flux a été atteint.

0 indique la fin du flux. La condition pour atteindre la fin du flux a déjà été définie. La condition sur laquelle vous vous reposez peut être non fiable et inutile.

Essayez

while(bytesRead != 0)

+0

Je suis d'accord que la condition est ... bizarre, mais elle ne devrait pas provoquer une boucle infinie. 'bytesRead' devrait toujours être inférieur ou égal à' totalBytesRead'. Je pense que quelque chose d'autre provoque un retard. – Cemafor

+0

@Cemafor - Je suis d'accord, c'est difficile à dire. J'exécuterais ce segment de code à travers un test unitaire pour être sûr. –

0

Il est préférable d'utiliser Toute raison StreamReader

using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
... 
reader.ReadToEnd(); 

// or 

while (!reader.EndOfStream) 
{ 
    // do read. 
} 
Questions connexes