2010-12-05 8 views
2

私のソケットにC#非同期ioモデルを使用したいと思います。私はソケットを介して送信する必要がある複数の スレッドがあります。これを処理する最良の方法は何ですか? ロックによってアクセスが制御されるN個のソケットのプール?または、asynchはスレッドセーフである を複数のスレッドが単一のソケットにアクセスするために送信しますか?複数のスレッドによってアクセスされるC#非同期ソケット

THanks!

ジャッコ

+0

http://www.albahari.com/threading/は、最高のスレッディングソリューションを見つけようとするときに読みやすいです。 – Patrick

+0

フォローする必要があるプロトコルがありますか?ストリームを順番に転送する必要がありますか? – Patrick

+0

ありがとう、パトリック。アルバハリは見た目が美しい。私はソケットを使用して、リモートサーバー上の値を設定して取得しています。私は非同期ソケットioを探していますが、私はそれがシステムスレッドプールを使用することを理解しています。だから、私は – Jacko

答えて

2

です。おそらくアプリケーションに不必要なオーバーヘッドが追加されます。すでに複数のスレッドがある場合は、ソケットへのアクセスを表すIDispoableタイプのオブジェクトと、ソケットのチェックインとチェックアウトを制御するマネージャを作成できます。 IDisposable disposeメソッドが呼び出されると、ソケット自体がチェックインされます。この方法でスレッドがソケット上で実行できるメソッドを制御することができます。 ソケットが別のスレッドによって既にチェックアウトされている場合、マネージャは使用可能になるまでブロックします。

using (SharedSocket socket = SocketManager.GetSocket()) 
{ 
    //do things with socket 
} 
+0

ありがとう、良いアイデア。私はすでにこれのようなものを持っています。私はちょうど呼び出しスレッドが成長するようにこれがうまくスケーリングされないことを心配しています。彼らはブロックするのに多くの時間を費やすかもしれません。 – Jacko

+1

スレッドがソケットに書き込む場合のみ、キューを使用してデータをソケットに書き込んで、別のスレッドがデータを消費するようにすることができます。このようにして、呼び出しスレッドはまったくブロックする必要はありません。 –

+0

ありがとうございます。それを試してみる。私もマルチコアを利用したいので、キューに入れられたこれらのソケットをいくつか走らせるかもしれません。 – Jacko

1

System.Threading.Semaphoreは、非同期メソッドがすでにデータを送信するために新しいスレッドを作成して同期させる際に便利になり何かとレースの条件

関連する問題