2017-08-17 1 views
1

Ich verstehe, dass ich Daten in ein TPL Dataflow-Ziel verwenden kann Post oder SendAsync und das wird sofort zurück, wenn das Element in das Ziel eingefügt werden konnte. Ich verstehe, dass SendAsync wird länger warten, um es auszuprobieren, aber ich bin mir nicht sicher, was die SendAsyncfalse Rückgabe ist.TPL Dataflow SendAsync Ergebnis

Gibt SendAsync zurück false signalisieren, dass das Ziel (speziell ein BufferBlock) fertig ist und wird nie mehr Nachrichten akzeptieren?
Ist es möglich, dass Nachrichten später akzeptiert werden?

+0

Es ist nicht möglich, den Block neu zu starten und 'SendAsync' wird' false' zurückgeben, wenn der Block keine Nachrichten annehmen kann. Die Antworten lauten: [SendAsync] (https: // stackoverflow.com/questions/13599305/tpl-dataflow-whats-the-funktional-difference-zwischen-post-und-sendasync) und [Neustart eines blocks] (https://stackoverflow.com/questions/15967903/task-dataflow-can -a-data-block-be-changed-from-completion-state) – JSteward

Antwort

0

Ich verstehe, dass Daten in ein TPL Datenfluß-Ziel setzen ich verwenden kann Post oder SendAsync

Correct

, die sofort zurück, wenn das Element in das Ziel genommen werden kann.

Nicht korrekt - wessen Methode beide sofort zurückkehren. Wenn Sie die Post verwenden, wird auch false zurückgegeben.

Ich verstehe, dass SendAsync länger warten wird ein Put es in

teilweise richtig zu versuchen. SendAsync wird eine Zustandsmaschine einrichten, die schließlich ein Ergebnis zurückgibt.

aber ich bin nicht sicher, was die Bedeutung von SendAsyncfalse Rückkehr ist.

Dies bedeutet, dass der Zielblock die Nachricht zu dem Zeitpunkt nicht akzeptieren kann.

Does SendAsync Rückkehr false Signal, dass das Ziel (genauer gesagt ein BufferBlock) beendet ist und wird nie mehr Nachrichten akzeptieren?

Es gibt viele Gründe dafür, nicht nur, dass das Ziel vollständig ist. Zum Beispiel ist der eigene Puffer möglicherweise voll mit Nachrichten, und ein anderer passt nicht hinein (wenn Ihr Block mit BoundedCapacity eingeschränkt ist). Sie können also nicht mit Sicherheit sagen, dass der Grund dafür, dass die Methode false zurückgegeben hat, der abgeschlossene Status ist. Wenn Sie jedoch die Kapazität des Puffers nicht einschränken, ist es wahrscheinlich.

Ist es möglich, dass Nachrichten später akzeptiert werden können?

Nein, Blöcke sind so konstruiert, dass sie nur einmal ausgeführt werden können. Sie müssen einen Block neu erstellen und ihn in die Pipeline einstecken, um ihn neu zu starten.

+0

Ich dachte, der Punkt von '' 'SendAsync''', der die Task ausführt, war, dass er auf die Löschung des Puffers warten könnte. Wenn der Puffer voll ist, kann '' 'SendAsync'''' '' 'false''' zurückgeben, was ist der Unterschied zu' 'Post'''? In welchen Situationen mit einem vollen Puffer verursacht '' 'SendAsync'''' '' '' false''' in der Aufgabe zurückzugeben und nicht länger zu warten, bis der Puffer gelöscht wird? – bsagal

+0

'SendAsync' versucht zuerst, die Nachricht synchron zu senden, so dass es zu diesem Zeitpunkt keinen Unterschied zu 'Post' gibt. Wenn target kein Ergebnis liefert, erstellt die Methode eine Zustandsmaschine und gibt eine "Task" zurück, die später beendet werden kann. Es kann immer noch "falsch" sein, zum Beispiel, wenn das Ziel im fehlerhaften Zustand ist. Sie können im Code auf Github ganze Möglichkeiten sehen. – VMAtm

+0

von Ihrer ursprünglichen Antwort verstehe ich, dass die '' 'SendAsync'' Task könnte' '' false'' zurückgeben, aber in Zukunft eine Aufgabe haben, die '' 'true''' zurückgibt. Das Beispiel, das Sie in den Kommentaren eines fehlerhaften Zustands angeben, wird jedoch nie wieder das Senden zulassen. Gibt es einen Fall, in dem die '' 'SendAsync''-Aufgabe' '' false''' zurückgeben könnte und später das Senden wieder zulässt? – bsagal

Verwandte Themen