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?)

Était-ce utile?

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

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