2009-07-17 7 views
4

J'utilise un seul modèle de producteur-consommateur unique avec une file d'attente bloquante. Je voudrais que le producteur, lorsqu'il a fini de produire, attende que la file d'attente se vide avant de revenir.Comment attendre le vidage d'une file d'attente de blocage par le travailleur

J'ai mis en œuvre le BlockingQueue suggéré here par Marc Gravell.

Dans mon modèle, le producteur (renderer) utilise des événements pour notifier le travailleur (imprimante) lorsqu'un fichier a été rendu (le worker place l'élément en attente) et quand chaque fichier a été rendu (terminé).

À l'heure actuelle, lorsque le rendu est terminé, la méthode se termine et le worker est tué, donc je me retrouve avec 10-15 fichiers rendus qui n'ont pas été imprimés.

Je souhaite que le gestionnaire d'événements finis se bloque jusqu'à ce que la file d'attente ait été vidée, par exemple, lorsque tous les fichiers sont imprimés. Je veux ajouter quelque chose comme une méthode "WaitToClose()" qui bloquera jusqu'à ce que la file soit vide.

(Would ayant le jeu de thread de travail à IsBackground = true faire une différence?)

+0

Je pense que Thread.IsBackground = true permet au processus de se terminer même si le thread est toujours en cours d'exécution. –

Répondre

4

Que diriez-vous d'ajouter un événement à la file d'attente:

private AutoResetEvent _EmptyEvent = new AutoResetEvent(false); 

Modifiez ensuite la file d'attente pour régler l'événement quand il est vide et vous pouvez bloquer sur l'événement.

En y réfléchissant davantage, cependant, lorsque la file d'attente est vide, l'imprimante imprime toujours le dernier élément. Donc, vous pouvez alors joindre (bloquer) sur le thread de travail.

Idée plus simple: bloquez simplement le thread de travail et faites terminer le thread de travail (sortie) lorsque la file d'attente est vide?

+0

Wow ... J'aurais dû y penser. Je viens de faire une jointure sur le thread de travail après avoir appelé la méthode Close() et pouf ... parfait. –

+0

Nice. Content que ça a marché. –

Questions connexes