0

stackoverflow で TcpClient とマルチスレッドについてよく読んだことがありますが、これに対する明確な答えが見つからなかったと思います。

3 つの同一のスレッドを持つアプリケーションがあります。(各スレッド オブジェクトで同じメソッドを呼び出す)

すべてのスレッドは、独自の (ローカル) TcpClient インスタンスを作成し、サーバー (異なる IP アドレス) への tcp 接続を開きます。

スレッドは、異なるサーバー上でのみ同じことを行うことになっています。3 台のサーバー マシンは、同一のサーバー ソフトウェアを実行しています。

これで、3 つのスレッドが「同時に」サーバー リクエストを開始します。

TcpClient オブジェクトは各スレッドで完全に分離されていますか? それとも、根底にあるストリームが不本意ながら共有されているのでしょうか?

スレッドが「彼の」サーバーからではないデータを取得することがあると感じました。たとえば、すべてのスレッドが「準備完了」フラグをポーリングしています。サーバー 1 のみが準備ができてフラグを設定しますが、スレッド 1 とスレッド 2 にはフラグが設定されていることがわかります。

私が間違ったことをしている可能性は十分にあります。ただし、この方法での TcpClient オブジェクトでの通信が安全であることを確実に知っておくと役立ちます。

提案をありがとう、ラルフ

PS: はい、私は現在、C# 8-)) でのマルチスレッドに関する書籍やドキュメントを読んでいます。

4

2 に答える 2

1

TcpClientインスタンスが分離している場合、それらは状態を共有しません。必要な数のTcpClientインスタンスを使用できます。データがスレッド間でリーチしている場合、私はそれがあなた自身のコードにあると推測することしかできません。ここでの混乱の一般的な原因は、キャプチャされた変数(ラムダ/アノンメソッドからのもの)です。これは、C#5より前では、カジュアルなレビュー担当者が予期しない方法で共有できます。これ以上の情報がなければ、これ以上言うことはできませんが、違います。お互いに干渉してはなりません。

于 2012-10-26T11:18:26.687 に答える
0

サーバーが応答を返すポートに問題がある可能性があります。送信元ポートは、サーバーにリクエストを送信するプログラムに応じて自動的に決定されます。おそらく、ポートの決定は各脅威間で異ならないため、3 つの同時実行の脅威は同じポートで応答を受け取ります...しかし、それは私が TCP にあまり興味がないという私の推測にすぎません

于 2012-10-26T12:03:55.750 に答える