c # barrière et la gestion des exceptions
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
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
SignalAndWait
s à 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.