Question

J'ai créé exemple simple c # qui utilise des barrières et je l'ai jeté une exception dans l'une des fonctions et je suis en train de résultat inattendu

phase 1 of DoWork1
phase 2 of DoWork2
phase 3 of DoWork3
Current phase 0
phase 2 of DoWork3
phase 2 of DoWork1
phase 3 of DoWork2
//so far everything is fine, lets throw an exception now

DoWork1 canceled
phase3 of DoWorn1

//end 

Comme vous pouvez le voir dans le code que j'ai jeté une exception dans la méthode de DoWork1 et j'attendre à ce que tous les 3 méthode traitera exception, mais seulement premier fait, deuxième problème est que seule impression de la première méthode « phase 3 bla bla » et Je m'y attendais tous les trois d'entre eux pour l'imprimer à la console. Quelqu'un pourrait-il me expliquer pourquoi cela se produit

code est un peu long mais la majeure partie est tout simplement copier coller

Était-ce utile?

La solution

D'abord, une exception levée sur un fil ne sera généralement pas disponible sur tous les autres sujets. Exceptions remonter la pile d'appel, et chaque thread a sa propre pile.

En second lieu, la raison pour laquelle les deux autres méthodes n'atteignent jamais la phase 3 est que lorsque DoWork1 lève l'exception, il est parce qu'il a essayé d'attendre que les autres participants à cette barrière et a échoué. À ce moment-là, la barrière ne croit plus que DoWork1 attend les autres participants, alors quand les deux autres SignalAndWait(), ils attendent toujours, parce que jamais DoWork1 SignalAndWaits à nouveau.

Autres conseils

Chaque thread a sa propre pile d'appel. de sorte que le fil dans lequel vous jetez l'exception à l'exception sera pris.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top