0

サーバー(エコー)のように機能するvb.netアプリケーションがあり、クライアント(別のアプリケーション)がサーバーにさまざまな種類のドキュメントやその他のファイルを照会できるようにします。今直面している問題は、アプリケーション(サーバーしかし、同じマシンまたは他のマシンからのクライアントがサーバーに接続してクエリを実行しようとすると、アプリケーションはサーバーと確立された接続のために別のスレッドを開始します。したがって、サーバーのデバッグ中に(VB.Netアプリケーション)、サーバーが起動した時点から開始された1つのスレッドで実行されている操作から、クライアントがサーバーに接続したときに開始される別のスレッドに制御が切り替わることがわかりました。しかし、全体が必要ですサーバーが起動した瞬間から開始された同じスレッドで実行される操作。

クライアントがサーバーに接続しようとすると開始される 2 番目のスレッドは、サーバーとクライアント間の接続にサード パーティ製のコントロール名 Dart TCP を使用しているためです。クライアントがサーバーに接続するには、クライアントが接続すると、以下のコードのようにInitializeメソッドで呼び出されるメソッド:

server.start(新しい ConnectThreadStart(AddressOf connectionstart )、ポート、状態)。ここで、connectionstartは接続を開始するメソッドであり、サーバーとクライアントのいずれかが接続を終了するまでの間の通信を担当します。

提供された解決策やアイデアは高く評価されます。事前に感謝します。

4

1 に答える 1

0

ご覧のとおり、新しいリクエストで開始された新しいスレッドがあります (これは良いことです)。

すべてのスレッドに構成設定を共有させる 1 つの (非常に悪い) 方法は、構成を格納するスレッドセーフ変数を使用することです。スレッドがアクセスする必要がある場合、スレッドはその変数のロックを取得し、読み取りまたは書き込みを行ってから、ロックを解放します。

これの非常に悪い部分は、すべてのスレッドが 1 つのリソースに依存していることです。これにより、アプリケーション全体が必要以上に遅くなる可能性があります。1 つの要求が構成変数をロックし、それを読み取る必要があるときに他のすべての要求が停止する可能性があります。デッドロック。

ただし、デバッグには十分かもしれません。

リソースのロックについて詳しくは、http ://support.microsoft.com/kb/816161 をご覧ください。

(デッドロックを回避する)より良い方法は、不変のデータ構造を使用することです。これは、最近ではNuGet ImmutableHashMapを通じて利用できるようです。

于 2013-08-16T11:33:01.860 に答える