.NET の他の非同期操作と同じ方法で行うと思います。メソッドの BeginXxx バージョン、この場合は BeginAcceptSocket を呼び出します。コールバックはスレッド プールで実行されます。
プールされたスレッドは、通常、接続ごとのスレッドよりもはるかに優れたスケーリングを行います。数十の接続を超えると、システムは、実際の作業を完了するよりも、スレッド間の切り替えにはるかに多くの負荷をかけます。さらに、各スレッドには、通常 1MB のサイズの独自のスタックがあり (リンク フラグによって異なります)、2GB の仮想アドレス空間 (32 ビット システムの場合) で見つける必要があります。実際には、これにより 1000 未満のスレッドに制限されます。
.NET のスレッドプールが現在それを使用しているかどうかはわかりませんが、Windows にはスケーラブルな I/O を支援する I/O Completion Port と呼ばれるカーネル オブジェクトがあります。スレッドをこのオブジェクトに関連付けることができ、I/O 要求 (着信接続の受け入れを含む) を関連付けることができます。I/O が完了すると (接続が到着するなど)、Windows は待機中のスレッドを解放しますが、現在実行可能な (他の理由でブロックされていない) スレッドの数が、完了ポートに構成されているスケーラビリティ制限よりも少ない場合に限ります。通常、これはコア数の小さな倍数に設定します。