Confusion quant à la synchronisation des threads lorsque deux threads appellent la même méthode

voix
0

J'ai créé une bibliothèque Messenger et je l'ai fait threadsafe il peut donc être partagée autour d'entre les fils sans souci. Je réalise ce en utilisant principalement la classe Monitor.

J'ai une routine de déconnexion qui peut prendre un certain temps car il tente d'attendre les transactions qui ont lieu avant qu'il arrête la prise etc. Il est asynchrone et a Begin / méthodes de fin, mais pour cet exemple nous allons juste faire semblant qu'il est synchrone.

Et si deux threads d'appel Déconnexion, l'un après l'autre? Que dois-je faire avec le second fil?

Actuellement je bloque (en utilisant Monitor.Wait d'attendre une impulsion du premier fil) jusqu'à ce que le premier et complète déconnexion jeter un AlreadyLoggedOutException.

J'ai aussi avoir joué avec une exception LogoutInProgress levée si la déconnexion est effectuée, mais appelle une déconnexion est déjà en place.

Les deux semblent avoir des avantages et des inconvénients, mais je voudrais savoir ce que les autres pensent est le meilleur.

Créé 08/04/2012 à 23:43
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
2

Quelle est la meilleure option sur les deux que vous avez mentionné, dépend de la façon dont vous voulez que votre bibliothèque se comporter.

Je ne jeter l'exception au consommateur et simplement tirer la fermeture de session de fin de l'événement async / méthode pour les deux fils lorsque la fermeture de session réelle complète. Quelle primitive de synchronisation, vous devriez utiliser pour atteindre cet objectif dépend de la conception de votre méthode / bibliothèque. Peut-être que si vous partagez plus de détails sur la méthode begin de fin que vous avez mentionné, je serai en mesure de proposer mieux.

Cette option serait plus facile à programmer contre.

Créé 08/04/2012 à 23:53
source utilisateur

voix
0

Il y a une option 3: Le deuxième thread essayant de déconnecter pourrait détecter, qu'un déjà arrivé et fermeture de session ne rien faire. Si le contrat de « Déconnexion » est « soit faire en sorte que l'utilisateur est déconnecté, ou jeter » alors vous devriez en effet faire Déconnexion idempotent.

Toutefois, si vous ne pouvez pas tolérer plusieurs déconnexions parce que ce serait une erreur de logique en quelque sorte, vous devriez jeter une exception.

Créé 09/04/2012 à 00:45
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more