「接続」という言葉の意味を定義することが重要だと思います。'
トランザクションが送信されるたびに、他のシステムがTcpListenerへの新しい接続を作成する場合、これは複数の接続とみなされ、これらの着信接続要求を処理する専用のスレッドを持つことは理にかなっています。このような場合は、これ以外のすべてを無視し、gahooaの提案ソリューションを使用してください。
一方、他のシステムが単純に接続を確立し、その同じ接続を介してすべてのトランザクションを送信すると、(接続が1つしかないため)別のスレッドで接続要求を処理することは実際にはありません。これが当てはまる場合は、着信要求を一度受け入れ、ソケットを非同期で読み取ることをお勧めします(データのソケットをポーリングするのではなく)。あなたが完全なトランザクションを受け取るたびに、それをトランザクション処理スレッドに「壁越しに」スローします。処理が完了し、 "答え"が計算されると、結果を他のシステムに返す応答スレッドに "壁越しに"スローします。
- メインスレッド
- 読むスレッド
- 処理スレッド
- 書き込みスレッド
は、メインスレッドがTcpListenerを作成し、接続するまで待機:このシナリオでは、基本的に4件のスレッドがあります確立されています。その時点で、非同期読み取りを開始し、プログラムが終了するまで待機します(ManualResetEvent.WaitOne())。
読み取りスレッドは、NetworkStreamからの読み取りを処理する非同期スレッドです。
処理スレッドは、読み取りスレッドからトランザクションを受け取り、必要な処理を行います。
書き込みスレッドは、処理スレッドによって生成された応答をすべて取り出し、それらをNetworkStreamに書き込みます。
このlinkによれば、読み取りと書き込みが別のスレッドで行われている限り、同じNetworkStreamからの読み取りと書き込みを同期させる必要はありません。ジェネリックリストまたはキューを使用して、スレッド間でデータを移動できます。私はRead-to-Processingデータ用とProcessing-to-Writeデータ用に作成します。 SyncRootプロパティを使ってアクセスを同期させてください。
同じクライアントからの同じポート上の多くの接続が「複数の接続」または1つの接続を構成したとしますか? – alchemical
それでも複数の接続と見なされます。 –