2014-05-01 14 views
5

Der TPL-Datenflussblock verfügt über die Eigenschaften .InputCount und .OutputCount. Aber es kann jetzt die Ausführung über einen Gegenstand ausführen, und es gibt keine Eigenschaft wie .Busy [Boolean]. Also gibt es eine Möglichkeit zu wissen, ob Block jetzt funktioniert und einer der Items noch da ist?Wissen Sie, ob TPL Dataflow Block ausgelastet ist?

enter image description here

UPDATE:

Lassen Sie mich meine Frage erläutern. Hier ist mein aktuelles Dataflow-Netzwerkschema. enthält URLs zum Laden, Nummer TransformBlock s Seiten über Proxy-Server laden und ActionBlock am Ende führt die Arbeit mit geladenen Seiten. TransformBlock s hat .BoundedCapacity vordefiniert, also wartet auf irgendeinen von TransformBlocks wird frei und Posten dann in es.

Zunächst poste ich alle URLs auf Buffer Block. Wenn eine der TransformBlock s Ausnahmen beim Laden von HTML auslöst, wird die URL zurück an gesendet. Mein Ziel ist es irgendwie zu warten, bis alle meine URLs garantiert geladen und geparst sind. Denn jetzt wie folgt ich warte:

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

     Await Task.Delay(1000) 
Loop 

Dann rufe ich TransformBlock.Complete auf allen von ihnen. Aber in diesem Fall kann es immer noch die letzten URLs sein, die es laden TransformBlock s. Wenn die letzte URL nicht erfolgreich geladen wurde, wird sie "verloren", weil sie von keinem von TransformBlocks zurückgenommen wurde. Deshalb möchte ich wissen, ob TransformBlock s noch in Betrieb sind. Entschuldigung für mein schlechtes Englisch.

enter image description here

+0

Wenn inputCount nicht Null ist und der Block nicht abgebrochen wird. Warum wäre es nicht beschäftigt? – i3arnon

+0

Warum möchten Sie das wissen? – svick

+0

@svick, bitte sehen Sie update. – AsValeO

Antwort

5

Auch wenn Sie heraus, ob ein Block ein Element verarbeitet finden könnte, wäre es nicht wirklich helfen, Ihr Ziel zu erreichen. Das liegt daran, dass Sie den Zustand aller Blöcke genau zum selben Zeitpunkt überprüfen müssen, und es gibt keine Möglichkeit, das zu tun.

Was ich denke, Sie müssen irgendwie manuell verfolgen, wie viele Artikel vollständig verarbeitet wurden und vergleichen Sie das mit der Gesamtzahl der Elemente zu verarbeiten.

Sie sollten die Anzahl der zu verarbeitenden Elemente von Anfang an wissen (Sie sind es, die sie an den Pufferblock sendet). Um die Anzahl der Elemente zu verfolgen, die vollständig verarbeitet wurden, können Sie Ihrem Parsing-Aktionsblock einen Zähler hinzufügen (vergessen Sie nicht, den Zähler threadsicher zu machen, da Ihr Aktionsblock parallel ist).

Dann, wenn der Zähler die Gesamtzahl der zu bearbeitenden Elemente erreicht, wissen Sie, dass alle Arbeiten erledigt sind.

+0

Danke nochmal, svick. Du hast meinen Tag gerettet. – AsValeO