Si votre intention est de créer une variante associé du motif producteur-consommateur, la séquence est Pulse
avant Wait
pour le producteur et Wait
avant Pulse
pour le consommateur. Vous pouvez référencer la figure 5 en Joe Duffy's article on this. Cependant, gardez à l'esprit que puisque sa mise en œuvre exécute un Wait
inconditionnel dans la méthode Enqueue
, un effet ping-pong se produira entre le producteur et le consommateur. La file d'attente, dans sa mise en œuvre, ne peut avoir qu'un seul élément par producteur. Donc, si c'est votre intention, alors votre billet. Sinon, vous pouvez l'adapter tel quel et appliquer une condition au Wait
dans la méthode Enqueue
pour qu'il se comporte davantage comme un vrai tampon FIFO.
Cependant, comme Reed, je me demande pourquoi BlockingCollection
n'a pas pu être utilisé. Cette collection devrait être très efficace car elle utilise une stratégie sans verrou pour les méthodes Add
et Take
. Bien sûr, comme je l'ai mentionné ci-dessus, si vous voulez vraiment la variante appariée, alors cette collection ne répondra pas à vos exigences et vous devrez rouler la vôtre en utilisant Joe Duffy's comme point de départ.
Rappelez-vous simplement d'utiliser une boucle while
au lieu d'un contrôle if
avant d'appliquer l'attente. Monitor.Wait
attend simplement un changement dans l'état de verrouillage et rien de plus, donc vous devez revérifier la condition d'attente.
Problème résolu en élargissant la portée de verrouillage et aveugle Wait() et Pulse() enlevé. Qu'est-ce que j'ai appris de Reed était ce pourquoi j'ai tellement de problèmes avec seulement deux fils et modèle connu de producteur/consommateur? Donc, redessiné en regardant une grande image. Le point était lorsque vous cherchez à coder dans Visual Studio, les lignes de code ont plus de sens que les cycles CPU, donc il est tentant de minimiser le temps de verrouillage alors que si ces lignes de code ne comparent rien à un changement de contexte. – Xaqron