2014-05-01 10 views
5

Il blocco TPL Dataflow ha .InputCount e .OutputCount proprietà. Ma ora può eseguire l'esecuzione su un oggetto e non ci sono proprietà come .Busy [Boolean]. Quindi c'è un modo per sapere se il blocco è ora operativo e uno degli oggetti è ancora lì?Modo per sapere se TPL Dataflow Block è occupato?

enter image description here

UPDATE:

Mi spiego il mio problema. Qui su pic è il mio attuale schema di rete Dataflow. BufferBlock contiene gli URL da caricare, il numero di pagine di caricamento di TransformBlock s tramite server proxy e ActionBlock alla fine esegue il lavoro con le pagine caricate. TransformBlock s ha predefinito .BoundedCapacity, quindi BufferBlock attende uno qualsiasi di TransformBlocks diventa gratuito e quindi inserisce l'elemento in esso.

Inizialmente inserisco tutti gli URL su Buffer Block. Inoltre, se uno dei TransformBlock s genera un'eccezione durante il caricamento di HTML, restituisce l'URL di nuovo a BufferBlock. Quindi il mio obiettivo è in qualche modo aspettare finché tutti i miei URL non sono stati caricati e analizzati. Per ora sto aspettando in questo modo:

Do While _BufferBlock.Count > 0 Or _ 
     GetLoadBlocksTotalInputOutputCount(_TransformBlocks) > 0 Or _ 
     _ActionBlock.InputCount > 0 

     Await Task.Delay(1000) 
Loop 

Poi chiamo TransformBlock.Complete su ognuna di esse. Ma in questo caso, ci possono ancora essere gli ultimi URL caricandolo TransformBlock s. Se l'ultimo URL non è stato caricato con successo, diventa "perso", perché nessuno dei TransformBlocks non lo riprende. Ecco perché voglio sapere se TransformBlock s sono ancora in funzione. Scusate il mio pessimo inglese.

enter image description here

+0

Se inputCount non è zero e il blocco non viene annullato. perché non dovrebbe essere occupato? – i3arnon

+0

Perché vorresti saperlo? – svick

+0

@svick, per favore guarda l'aggiornamento. – AsValeO

risposta

5

Anche se si potrebbe scoprire se un blocco è in corso l'elaborazione di un elemento, non sarebbe davvero aiutare a raggiungere il tuo obiettivo. Questo perché è necessario verificare lo stato di tutti i blocchi esattamente nello stesso momento e non c'è modo di farlo.

Quello che penso sia necessario è in qualche modo tenere traccia manualmente di quanti articoli sono stati completamente elaborati e confrontarli con il numero totale di elementi da elaborare.

È necessario conoscere il numero di elementi da elaborare dall'inizio (siete voi che li inviate al blocco buffer). Per tenere traccia del numero di elementi che sono stati completamente elaborati, è possibile aggiungere un contatore al blocco azione di analisi (non dimenticare di rendere il contatore sicuro perché il blocco azione è parallelo).

Quindi, se il contatore raggiunge il numero totale di elementi da elaborare, si sa che tutto il lavoro è stato eseguito.

+0

Grazie ancora, svick. Hai reso la mia giornata. – AsValeO

Problemi correlati