2012-01-04 2 views
3

Existe-t-il un moyen plus rapide de savoir si le client dispose de données? Je ne dis pas qu'il est lent à utiliser TcpClient.Available, mais je suis curieux de savoir si c'est le moyen le plus rapide.TcpClient.Available Optimisations

+0

Dans quel type de scénario d'utilisation? Si vous avez une tonne de sockets et que vous voulez savoir si certains d'entre eux sont devenus lisibles, Socket.Select peut aussi être intéressant. – harold

+0

Veuillez ne pas préfixer vos titres avec "C#" et ainsi de suite. C'est ce que les tags sont pour. –

Répondre

2

TcpClient.Available n'est pas lent en soi, cela dépend de la façon dont vous l'utilisez.

Si vous ne l'utilisez que ponctuellement pour vérifier si les données sont disponibles, alors c'est la voie à suivre.

Si vous l'utilisez en boucle pour attendre des données, les performances globales de votre programme seront assez mauvaises. Voici une de cette mauvaise utilisation:

public void Receive() 
{ 
    while (tcpClient.Connected) 
    { 
     if (tcpClient.Available >= 0) 
     { 
      // Do something 
     } 
    } 
} 

Pour ce deuxième scénario, vous pouvez obtenir ce que vous voulez en utilisant soit:

1

Si tout ce que vous devez savoir, c'est s'il existe des données disponibles, et vous n'avez pas l'intention de faire quoi que ce soit avec les données, alors c'est probablement l'approche la plus rapide. Mais si vous choisissez d'interroger pour savoir s'il y a quelque chose à lire, utilisez les E/S asynchrones: lancez une opération de lecture asynchrone (BeginRead) et dès que des données arrivent, vous serez appelé à traiter. Ce sera beaucoup plus rapide (et plus efficace) que l'interrogation pour voir s'il pourrait y avoir des données.