Comment attendre une file d'attente de blocage doit être vidé par travailleur
-
16-09-2019 - |
Question
J'utilise un seul modèle de consommateur unique producteur avec une file d'attente de blocage. Je voudrais que le producteur, quand il a fini de produire, d'attendre la file d'attente à vide avant de revenir.
Je mis à exécution les ici par Marc Gravell.
Dans mon modèle, le producteur (équarrissage) utilise des événements pour notifier le travailleur (imprimante) lorsqu'un fichier a est rendu (travailleur des files d'attente l'élément) et quand chaque fichier a été rendu (fini).
En ce moment, lorsque le moteur de rendu est fait, la méthode se termine et le travailleur est tué, alors je finis avec 10-15 fichiers rendus qui ne sont pas imprimés.
Je veux que le gestionnaire d'événements terminé pour bloquer jusqu'à ce que la file d'attente a été vidé, par exemple, lorsque tous les fichiers sont imprimés. Je veux ajouter quelque chose comme une méthode « WaitToClose () » qui bloque jusqu'à ce que la file d'attente est vide.
(ayant le fil Would des travailleurs mis à IsBackground = true
faire une différence?)
La solution
Que diriez-vous d'ajouter un événement à la file d'attente:
private AutoResetEvent _EmptyEvent = new AutoResetEvent(false);
Ensuite, modifiez la file d'attente pour régler l'événement quand il est vide, et vous pouvez bloquer l'événement.
Penser à travers plus loin, cependant, lorsque la file d'attente est vide, l'imprimante sera toujours l'impression du dernier élément.
Alors, vous pouvez rejoindre (bloc) sur le thread de travail.
idée Simpler: bloquer juste sur le thread de travail, et ont la finition de fil de travail (sortie) lorsque la file d'attente est vide
?