Domanda

Sto utilizzando un modello singolo produttore-singolo consumatore con una coda di blocco.Vorrei che il produttore, una volta terminata la produzione, aspettasse che la coda si svuotasse prima di rientrare.

Ho implementato il BlockingQueue suggerito Qui di Marc Gravell.

Nel mio modello, il produttore (renderer) utilizza eventi per notificare al lavoratore (stampante) quando è in corso il rendering di un file (il lavoratore mette in coda l'elemento) e quando ogni file è stato renderizzato (terminato).

In questo momento, una volta terminato il renderer, il metodo termina e il lavoratore viene ucciso, quindi mi ritrovo con 10-15 file renderizzati che non sono stati stampati.

Voglio che il gestore eventi finito si blocchi finché la coda non viene svuotata, ad esempio quando tutti i file vengono stampati.Voglio aggiungere qualcosa come un metodo "WaitToClose()" che si bloccherà finché la coda non sarà vuota.

(Avere il thread di lavoro impostato su IsBackground = true fare la differenza?)

È stato utile?

Soluzione

Che ne dici di aggiungere un evento alla coda:

private AutoResetEvent _EmptyEvent = new AutoResetEvent(false);

Quindi modifica la coda per impostare l'evento quando è vuoto e puoi bloccare l'evento.

Riflettendoci ulteriormente, tuttavia, quando la coda è vuota, la stampante stamperà ancora l'ultimo elemento.

Quindi, potresti unirti (bloccare) al thread di lavoro.

Idea più semplice:basta bloccare il thread di lavoro e terminare (esci) il thread di lavoro quando la coda è vuota?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top