2012-01-04 58 views
3

クライアントにデータがあるかどうかを確認する方法はありますか?私はそれがTcpClient.Availableを使うのが遅いと言っているわけではありませんが、それが最速の方法かどうかを知りたいのです。TcpClient.Available最適化

+0

どのような使用状況のシナリオでですか?大量のソケットがあり、そのうちのどれかが読み込み可能になっているかどうかを知りたければ、Socket.Selectも興味深いかもしれません。 – harold

+0

タイトルに「C#」などのプレフィックスを付けないでください。それはタグのためのものです。 –

答えて

2

TcpClient.Availableはそれ自体が遅くはなく、使い方によって異なります。

使用可能なデータがあるかどうかを確認するためにのみ使用する場合は、その方法があります。

データを待つためにループ内で使用すると、プログラム全体のパフォーマンスが非常に悪くなります。ここでは、この悪い使い方の一つである:

  • 非同期読み込み(NetworkStream.BeginReadを見て)=>最もスケーラブルな
  • ブロッキング:

    この2番目のシナリオについては
    public void Receive() 
    { 
        while (tcpClient.Connected) 
        { 
         if (tcpClient.Available >= 0) 
         { 
          // Do something 
         } 
        } 
    } 
    

    、あなたはどちらかを使用して、あなたが望むものを達成することができます(NetworkStream.Readを利用して提案されたソリューションhereを参照してください)

1

利用可能なデータがあるかどうかを知る必要があり、データで何かをするつもりがない場合は、おそらく最も速いアプローチです。

しかし、ポーリングして何かがあるかどうかを判断する場合は、非同期I/Oを使用します。非同期読み取り操作(BeginRead)を開始し、データが到着すると直ちにそれを処理する。これは、データがあるかどうかを調べるために、ポーリングよりもはるかに高速(かつ効率的)になります。