これは、.NETの他の非同期操作と同じ方法で行うと考えています。この場合、BeginXxxバージョンのメソッド(この場合はBeginAcceptSocket)を呼び出します。コールバックはスレッドプール上で実行されます。
一般にプールされたスレッドは、接続ごとのスレッドよりもはるかに優れています。数十回の接続を超えると、システムは実際の作業を行うよりもスレッド間の切り替えがはるかに難しくなります。さらに、各スレッドは、(32ビットシステム上で)2GBの仮想アドレス空間で見つかるはずの(通常はリンクフラグに依存しますが)通常はサイズが1MBの独自のスタックを持っています。これは実際には1000スレッド未満に制限されます。
.NETのスレッドプールで現在使用されているかどうかはわかりませんが、スケーラブルなI/Oを支援するI/O完了ポートと呼ばれるカーネルオブジェクトがWindowsにあります。スレッドをこのオブジェクトに関連付けることができ、I/O要求(着信接続の受け入れを含む)を関連付けることができます。 I/Oが完了すると(たとえば、接続が到着すると)、Windowsは待機中のスレッドを解放しますが、現在実行可能なスレッドの数が他の理由でブロックされていない場合にのみ完了ポートのスケーラビリティ制限が小さくなります。通常、これをコア数の小さな倍数に設定します。
ソースコードをありがとう、私はこれのようにコーディングされます。 新しいスレッドは高価になる可能性がありますが、5〜6同時接続の受信接続を超えて拡張することはできません。 –
リスナーとtcpListenerが混乱していると思います。 これを見つけた:http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.beginaccepttcpclient.aspx私はここに賛成します。 –
現在のコードはパフォーマンスのコンテキストで非常に危険です。私はそれを編集します... – Beygi