0

Messenger ライブラリを作成し、それをスレッド セーフにしたので、スレッド間で安心して共有できます。私は主に Monitor クラスを使用してこれを実現します。

ソケットなどをシャットダウンする前にトランザクションが発生するのを待機しようとするため、完了するまでに時間がかかる可能性のあるログアウト ルーチンがあります。これは非同期で、Begin/End メソッドがありますが、この例では同期のふりをします。

2 つのスレッドが次々に Logout を呼び出すとどうなるでしょうか? 2番目のスレッドで何をすべきですか?

現在、最初のログアウトが完了するまで (Monitor.Wait を使用して最初のスレッドからの Pulse を待機して) ブロックし、AlreadyLoggedOutException をスローします。

Logout が呼び出されたが、ログアウトが既に行われている場合に LogoutInProgress 例外をスローすることも試しました。

どちらも一長一短あるようですが、他の方が良いと思うものを知りたいです。

4

2 に答える 2

2

あなたが言及した2つのうちの最良のオプションは、ライブラリをどのように動作させたいかによって異なります。

コンシューマーに例外をスローせず、実際のログアウトが完了すると、両方のスレッドに対して終了ログアウト非同期イベント/メソッドを単純に起動します。これを実現するためにどの同期プリミティブを使用する必要があるかは、メソッド/ライブラリの設計によって異なります。あなたが言及したBegin Endメソッドの詳細を共有していただければ、より良い提案ができるでしょう。

このオプションは、プログラムに対してより簡単になります。

于 2012-04-08T22:53:19.310 に答える
0

3番目のオプションがあります。ログアウトしようとしている2番目のスレッドは、ログアウトがすでに発生していることを検出し、何もしません。「ログアウト」の契約が「ユーザーがログアウトしていることを確認するか、スローする」である場合は、実際にログアウトをべき等にする必要があります。

ただし、論理エラーになるために複数のログアウトを許容できない場合は、例外をスローする必要があります。

于 2012-04-08T23:45:43.233 に答える