1

TCP 接続を介してサーバーと通信するマルチスレッド アプリケーションがあります。アプリケーションは Windows サービスとしてデプロイされます。

実装されている方法は、オブジェクトControllerを作成Communicatorし、ポート番号、メッセージ数などのプロパティをに割り当て、Communicatorそのメソッドを呼び出しStartClientてサーバーとのダイアログを開始することです。

メソッド内でStartClient、各Communicatorオブジェクトは、 で指定されたポート番号と URL を使用して、サーバーへの接続を作成しますController。接続を確立した後、内部でスレッドを作成しReadMessages、メッセージ数が満たされるまでサーバーから読み取り続けるメソッドを呼び出してから閉じます。

ランタイム条件に基づいて、Communicatorオブジェクトを再利用してサーバーと再度通信する必要がある場合があるため、ReadMessagesメソッドが再度呼び出されます。

最初はDispose()、メソッドの完了時に NetworkStream、StreamReader、および StreamWriter オブジェクトのメソッドを呼び出していましたが、再接続シナリオでは、「破棄されたオブジェクトにアクセスできません」というエラーReadMessagesがスローされていました。そのため、テストのためにメソッド呼び出しをコメントアウトしました。Dispose

今のところ問題なく動作していますが、オブジェクトを破棄していないため、これがこの機能を実現するための最良の方法ではないことを懸念しています。

オブジェクトのプーリングに関して考えていたのですが、別のスレッドで再利用できる Stream オブジェクトのプールを持つことが可能なら?

これに取り組む 1 つの方法は、 がサーバーに接続するたびに Stream オブジェクトの新しいインスタンスを作成することですCommunicatorが、それはコストのかかる操作になると思います。

Communicatorパフォーマンスに影響を与えずにオブジェクトを再利用できるように、この状況を処理するためのより良いアプローチを特定するのを手伝ってくれませんか?

4

1 に答える 1

0

アプローチは、メッセージを読み取る必要がある頻度に基づいています-たまになら、コミュニケーターオブジェクトをリファクタリングして「ReadMessages」操作をアトミックにすることをお勧めします-つまり、サーバーに接続し、ネットワークストリームを作成します、メッセージを読み、すべてを破棄します。

于 2010-12-21T07:04:47.027 に答える