Ich habe zwar noch nicht mit Sockets gearbeitet, aber dein Vorgehen kommt mir ein wenig spanisch vor.
C#-Quelltext
1: 2: 3: 4: 5:
| do { countReceive = cClient.Available; } while (countReceive != cClient.Available); |
Lassen wir das Sleep einfach weg, steht da: "Setze meine Variable auf einen bestimmten Wert. Wenn meine Variable nicht den bestimmten Wert hat, tue das gleiche nochmal.
Das erinnert ein wenig an
C#-Quelltext
1: 2: 3: 4:
| do { int i = 42; } while (i != 42) |
Daß diese eine Überprüfung einige hundert MAle schneller ist, als das Empfangen über den TCP-Client, egal welche Anbindung du hast, leuchtet schnell ein, denn das ist eine Operation die in Assembler wenige Takte benötigt (das Aufrufen der Methode schon eingerechnet).
Dein Warten auf neue verfügbare Daten ist bei diesem Vorgehen also zwingend notwendig.
Vielleicht möchtest du System.Net.Sockets.NetworkStream verwenden, der eine Eigenschaft NetworkStream.DataAvailable hat zu deren Verwendung es in der Referenzdoumentation ein Beispiel gibt:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| if(myNetworkStream.CanRead){ byte[] myReadBuffer = new byte[1024]; StringBuilder myCompleteMessage = new StringBuilder(); int numberOfBytesRead = 0;
do{ numberOfBytesRead = myNetworkStream.Read(myReadBuffer, 0, myReadBuffer.Length);
myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead)); } while(myNetworkStream.DataAvailable);
Console.WriteLine("You received the following message : " + myCompleteMessage); } else{ Console.WriteLine("Sorry. You cannot read from this NetworkStream."); } |
Sieht für mich deutlich eleganter aus, als deine Lösung.
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk.