2017-04-26 2 views
1

Lassen Sie uns sagen, dass ich eine BufferBlock mit einer beschränkten Kapazität von 2 haben, und ich verknüpfen (mit LinkTo()) eine ActionBlock mit MaxDegreeOfParallelism = 2. Nun, ich weiß, dass ich sofort in der Lage sein wird, zwei Elemente in die Puffer zu senden und die ActionBlock wird fange an, sie sofort zu verarbeiten. Nehmen wir an, die Aktionen dauern ein paar Sekunden. Kann ich zwei weitere Objekte in den Puffer senden, während die ersten Aktionen ausgeführt werden oder wird ein Objekt erst aus dem Puffer entfernt, nachdem die Aktion, die es verbraucht, abgeschlossen ist?Werden Elemente aus BufferBlock entfernt, wenn ActionBlock gestartet oder beendet wird?

Antwort

1

Wenn Ihre ActionBlock über eine nicht gebundene Kapazität verfügt, ist die begrenzte Kapazität auf Ihrer nicht von Bedeutung, die ActionBlock puffert alle Ihre Elemente, bis der Arbeitsspeicher erschöpft ist. Wenn Sie jedoch BoundedCapcity auf Ihrem ActionBlock zu 2 sowie MaxDegreeParallelism zu 2 gesetzt haben, wird es zwei Nachrichten verarbeiten und 2 Nachrichten in seinem Puffer speichern. Dann puffert Ihr Pufferblock 2 zusätzliche Nachrichten. Alle zusätzlichen Nachrichten müssen auf die Kapazität in Ihrer Pipeline warten. Der beste Weg, auf Freiraum zu warten, ist await myPipeline.SendAsync(data). Insgesamt hätten Sie eine Kapazität von 6 für die gesamte Pipeline.

+0

Dank Jsteward. Ich wusste nicht, dass der ActionBlock auch die Dinge puffert. Was ich eigentlich will, ist, dass nur zwei Prozesse parallel laufen, aber ich möchte keine zusätzlichen Jobs puffern. Wenn ich SendAsync zweimal anrufe, möchte ich, dass der dritte Aufruf wartet, bis einer der ersten beendet ist. Ist das möglich? – PICyourBrain

+3

Ok, wenn du den 'BufferBlock' weglegst, hat der einzelne 'ActionBlock', der wie oben konfiguriert ist, eine Kapazität von 4. Zwei in der Verarbeitung und zwei gepufferte, werden jedoch immer nur zwei Jobs zu einer bestimmten Zeit verarbeiten. Unglücklicherweise gibt es bei Blöcken, die die 'BoundedCapacity' auf 1 setzen, immer noch einen Block mit einer Kapazität von 2, einen in der Verarbeitung und einen im Puffer und das ist der niedrigste, den du gehen kannst. – JSteward

Verwandte Themen