TCP 接続を介してサーバーと通信するマルチスレッド アプリケーションがあります。アプリケーションは Windows サービスとしてデプロイされます。
実装されている方法は、オブジェクトController
を作成Communicator
し、ポート番号、メッセージ数などのプロパティをに割り当て、Communicator
そのメソッドを呼び出しStartClient
てサーバーとのダイアログを開始することです。
メソッド内でStartClient
、各Communicator
オブジェクトは、 で指定されたポート番号と URL を使用して、サーバーへの接続を作成しますController
。接続を確立した後、内部でスレッドを作成しReadMessages
、メッセージ数が満たされるまでサーバーから読み取り続けるメソッドを呼び出してから閉じます。
ランタイム条件に基づいて、Communicator
オブジェクトを再利用してサーバーと再度通信する必要がある場合があるため、ReadMessages
メソッドが再度呼び出されます。
最初はDispose()
、メソッドの完了時に NetworkStream、StreamReader、および StreamWriter オブジェクトのメソッドを呼び出していましたが、再接続シナリオでは、「破棄されたオブジェクトにアクセスできません」というエラーReadMessages
がスローされていました。そのため、テストのためにメソッド呼び出しをコメントアウトしました。Dispose
今のところ問題なく動作していますが、オブジェクトを破棄していないため、これがこの機能を実現するための最良の方法ではないことを懸念しています。
オブジェクトのプーリングに関して考えていたのですが、別のスレッドで再利用できる Stream オブジェクトのプールを持つことが可能なら?
これに取り組む 1 つの方法は、 がサーバーに接続するたびに Stream オブジェクトの新しいインスタンスを作成することですCommunicator
が、それはコストのかかる操作になると思います。
Communicator
パフォーマンスに影響を与えずにオブジェクトを再利用できるように、この状況を処理するためのより良いアプローチを特定するのを手伝ってくれませんか?