2011-03-08 6 views
1

私は、単一のソケットに接続し、連続したデータを読み取るサービスを作成しています。私が受け取ったデータは、処理する別のスレッド(サービス内)に渡す必要があります。その理由は、処理に時間がかかることがあり、ソケットの受信をブロックしたくないからです。C#1ソケットクライアント連続データ

私は、BeginまたはAsyncの受信メソッドを使用して、スレッドが並行キューなどの読み取りを実行しているのではなく、データを処理することにしました。大量のデータがソケットを経由してくる可能性があるため、これを調整する必要があります。助言がありますか?

答えて

5

どのように非同期受信を使用して処理に役立つのか分かりません。私が理解しているように、ソケットに接続して連続したデータストリームを読み取るスレッドが1つあります。スレッドがその連続ストリームを何らかの種類のレコード、または少なくとも管理可能なサイズのブロックに分割できると仮定します。そのデータを1つまたは複数の処理スレッドで使用できるようにする必要があります。

データを読み取っているスレッドと処理を行うスレッドとの間で通信するために、並行キュー(実際にはBlockingCollection)を使用することを強くお勧めします。 - 明示的なロックコードこれは、Nの読者とN効率的作家 を扱う

  • それがない非ビジー待機

    • イッツ使いやすいです:私はBlockingCollectionを使用することをお勧めいくつかの理由があります。

      Yoursはかなり典型的なプロデューサー/コンシューマーアプリケーションです。プロデューサ(ソケットを読み取るスレッド)はデータを取得し、それをキューに入れ、次に1つ以上のコンシューマ(スレッドの処理)がデータを読み込んで処理します。私はBlockingCollectionより.NETでこれを行うためのより簡単で、より効果的な、あるいはより効率的な方法を考えることはできません。

  • +0

    はい、本当にありがとうございます。それが単なる接続の場合、ソケットから同期的に読み取る専用スレッドがおそらくより良い選択肢になるでしょう。非同期メソッドは、複数の接続を扱うときに本当に輝きます。 – spender

    +0

    ありがとう私は、このようなソリューションを既に用意していましたが、キューにバイトをダンプするだけで、並行キューを使用しました。次に、もう一方のスレッドでデータを分割します。ですから、私はそれがFIFOである必要があります、blockingcollectionがあるかどうか分かりません。 – Mark

    +0

    @マーク: 'BlockingCollection'のデフォルトバッキングストアは' ConcurrentQueue'なので、デフォルトではFIFOです。必要に応じてバッキングストアを変更することができますが、FIFOキューが必要な場合は、デフォルトにすることをお勧めします。 –

    1

    パフォーマンスのボトルネックであることがわかるまで、私はBeginXXXXメソッドを使用します。 XXXXAsyncメソッドは実装するのがかなり手間がかかります。固定配列を使用していて、ドキュメントで説明されているようにSocketAsyncEventArgsをプールしない限り、後のAPIの使用にはほとんど注意しません。

    +0

    ありがとうございます。私はプロセスが受信を停止することを望んでいないので、前のBeginReceiveのコールバックでBeginReceiveを再度呼び出すだけですか? – Mark

    +0

    はい、コールバックでEndReceiveを確認してからもう一度やり直してください。 @ Jimの答えによれば、同期メソッドを使用する専用の読み込みスレッドが目的に適している可能性が高くなります。 – spender

    関連する問題