2012-08-30 6 views
6

Sto utilizzando un problema Producer-Consumer e ho un BlockingCollection che produco dati e consumano dati da esso. Chiamo un metodo per produrre i dati e imposta la blocking collection a CompleteAdding in modo che il consumatore consumi tutti i dati dal BC (blockingcollection), e dopo qualche elaborazione l'applicazione vuole aggiungere altri dati al BC, ma non può perché è impostato su CompleteAdding, come posso impostare CompleteAdding su false, o come posso consumare tutti i dati dal BC, non aspettando il ComleteAdding?L'aggiunta a BlockingCollection dopo CompleteAdding è denominata

Grazie.

risposta

10

Non è possibile - l'intero punto di chiamata CompleteAdding è quello di dire "Non ci saranno mai più dati aggiunti a questa raccolta .Una volta vuoto, si sa che hai finito." Quello che chiedi è un po 'come dire: "Dopo aver chiuso una connessione di rete, come posso riaprirlo per poter scrivere più dati?"

Il fatto che tu voglia a suggerisca di riconsiderare il tuo design. Forse dovresti creare un nuovo BlockingCollection a questo punto? O forse tu non davvero vuoi chiamare CompleteAdding per iniziare?

+0

Ma se non chiamo CompleteAdding, come finisce il ciclo? perché uso un ciclo con la proprietà .GetConsumingEnumerable() – XandrUu

+0

@XandrUu: In generale, non è corretto, perché si inserirebbero più dati. Se si desidera un'idea "finito questo lotto", si potrebbe voler considerare un valore sentinella ... o avere una collezione per partita. –

+0

@JonSkeet quale sarebbe l'usecase per chiamarlo, cioè: perché ti limiti a dire, questa collezione è chiusa? – koenmetsu

Problemi correlati