2010-01-08 5 views
0

Je sais qu'il est subjectif, mais ce fut le résultat que je suis venu avec basé sur la réponse à me question précédente et il semble un peu « giflé ensemble », comme je l'ai changé un peu:Est-ce le meilleur code à utiliser pour lire à partir d'un réseau (vb.net)?

Private Function ReadFromBuffer(ByVal objReader As NetworkStream) As Byte() 
    Dim intRead As Integer = 1024 
    Dim allBytes(-1) As Byte 

    While intRead = 1024 
     Dim byteTempbuffer(1023) As Byte 
     intRead = objReader.Read(byteTempbuffer, 0, 1024) 
     ReDim Preserve byteTempbuffer(intRead - 1) 
     Dim tempold(allBytes.Length - 1) As Byte 
     tempold = allBytes 
     allBytes = tempold.Concat(byteTempbuffer).ToArray 
    End While 

    Return allBytes 
End Function 

Fondamentalement, y a-t-il une meilleure façon d'écrire ceci (même juste une partie du code) ou une façon plus efficace de le faire?

Fondamentalement, le code est là pour lire tous les octets d'un réseau 1024 octets à la fois. Et chaque fois qu'il lit les octets il met dans un tableau qui est retourné. Le point que je pense pourrait être meilleur est seulement Redim byteTempbuffer si intRead est inférieur à 1024 (le redim est d'éviter d'ajouter des octets vides à la fin du tableau quand il y a moins de 1024 octets à lire depuis le networkstream) (fondamentalement, est-il plus efficace pour Redim à chaque fois ou pour passer et si déclaration et redim seulement si nécessaire)

+0

Je pense que cela appartient à codereview.stackexchange.com – finnw

Répondre

2

Ce n'est certainement pas la meilleure façon de le faire: dans chaque itération de la boucle, vous êtes allouer un nouveau tampon, plus grand que le précédent ... cela pourrait mettre beaucoup de pression sur le GC.

Si vous ne connaissez pas la longueur totale des données, vous pouvez utiliser un MemoryStream:

Private Function ReadFromBuffer(ByVal objReader As NetworkStream) As Byte() 
    Dim intRead As Integer = 1024 
    Dim byteTempbuffer(1023) As Byte 
    Dim allBytes As New MemoryStream 

    While intRead = 1024 
     intRead = objReader.Read(byteTempbuffer, 0, 1024) 
     allBytes.Write(byteTempbuffer, 0, intRead) 
    End While 

    Return allBytes.ToArray() 
End Function 
+0

Merci, je pensais qu'il y avait une meilleure façon:) –

Questions connexes