2009-08-26 7 views
4

一つsend()メソッドを使用するように、2つのスレッドで共有することができる .NET C#ソケット同時実行は、

System.Net.Sockets.Socketのインスタンスを発行し、もう一つは、それは()メソッドを受信ですか?

安全ですか?

まあ、私はそれをする必要がないだけでスレッドセーフでなく、そのセンド/各スレッドが同時にそれらを呼び出すようにするような方法は、非syncronizedも受けます。

別の方法がありますか?助けるため

おかげで、私はJavaで経験したが、このものを作ろうと苦労しています。

答えて

6

安全です。はい。 SocketクラスはMSDN to be fully thread-safeによって引用されています。

しかし、良いアイデアかどうかはわかりません。あなたは、2つのスレッドを使用することによって、自分自身にとって難しいかもしれません。非同期バージョンの場合は、BeginSendBeginReceiveを参照することをお勧めします。その場合は、複数のスレッドを必要としません。

+1

よりスケーラブルで、私だけでなく、スレッドセーフでなく、読み取り/書き込みの同時使用が心配です。そして、うーん、もう一度何かを聞かせてください、私に答えてください。ボンネットの下で、これらの非同期メソッドを使用すると、別のスレッドが非同期性を達成するように管理できますか?もしそうなら、私がbegin ...を呼び出すたびに、それは新しいスレッドを作りますか? –

+1

私が知る限り、新しいスレッドが作成されますが、1回の呼び出しごとに新しいスレッドにはなりません。私は確認するために少しテストをした、と確かにそのように見えます。 – Thorarin

+0

参照:D –

2

はい、同時に送信し、2つの異なるスレッドから受け取るアクセスする完全に安全です。

、あなたのアプリケーションがアクティブなソケットの100年代に拡張したい場合は、手動でスレッドを作成とは対照的に、BeginReceiveve/BeginSendメソッドを使用したいと思います。これは舞台裏で魔法を行うので、ソケットを処理するためにスレッドを100個作成することはありません。正確にはプラットフォームに依存します。ウィンドウでは、「高性能」IO完了ポートを使用します。 Linux(モノ)の下で私は信じるepollを使用します。いずれにしても、アクティブなソケットよりもスレッド数が少なくて済むでしょう。これは常に良いことです。

+0

なぜ、受信/送信専用スレッドを使用すると、より大きな待ち時間を課したり、非同期メソッド? –

+1

あなたが500個のオープンソケットを持っていて、それらから受信しているだけだとします。あなたはそれぞれがSocket.Receive()でブロックする500スレッドをスピンアップする必要があります。 ここで、メソッドの非同期BeginReceiveバージョンを使用したとします。 .NETランタイムはソケットをOSに渡し、「データがあるときは教えてください」と言うでしょう。データがあるとき、ランタイムはスレッドプールからスレッドを取得し、AsyncCallbackを呼び出してデータを処理します。 これは、コンテキスト切り替え500スレッドよりもパフォーマンスが優れています。 – Alan

2

クライアントが限られている場合は、トピックはほとんどありませんが同期メソッドを使用すると便利です。非同期ソケットは応答が遅いとわかりました。非同期ソケットは、多くのクライアントを扱う方がはるかに優れています。

ので: 同期が道高速です。 非同期はまず

関連する問題