Hier the official sample von PipeTo()
in Akka.NET mit:Warum sollte ich den Sender mit PipeTo() schließen?
Receive<BeginProcessFeed>(feed =>
{
//instance variable for closure
var senderClosure = Sender;
SendMessage(string.Format("Downloading {0} for RSS/ATOM processing...", feed.FeedUri));
//reply back to the sender
_feedFactory.CreateFeedAsync(feed.FeedUri).PipeTo(senderClosure);
});
Die Frage ist, warum sollten wir hier Sender
Schließung benutzen? Warum nicht einfach zu verwenden:
_feedFactory.CreateFeedAsync(feed.FeedUri).PipeTo(Sender);
In diesem Beispiel und in dem docs es gesagt ist es zwingend notwendig, Schließung hier zu verwenden. Aber ich sehe keine Gründe dafür.
Wenn wir ContinueWith()
verwendet haben, ist es sinnvoll, den Abschluss in der Fortsetzung zu verwenden, aber nicht als PipeTo()
Parameter.
Vermisse ich etwas?
Das von Ihnen beschriebene Problem tritt auf, wenn der Compiler "this" im Kontext einer Schließung erfasst. Zum Beispiel passiert es, wenn wir "this" -Members (wie Sender) in Lambda-Ausdrücken verwenden. Aber hier übergeben wir einfach den Parameter an die PipeTo() -Methode und es werden keine Closures erzeugt. – alexey
Sender ist eine kontextsensitive Methode - der Wert mutiert jedes Mal, wenn eine Nachricht von einem Akteur empfangen wird. Wenn der aktuelle Wert von Sender nicht in einer lokalen Variable zwischengespeichert wird, die bei der Verwendung von PipeTo geschlossen wird, besteht die große Chance, dass Ihr Sender-Aufruf einen anderen Wert als den von Ihnen erwarteten zurückgibt. Wir konnten diesen Fehler mehrfach replizieren: p – Aaronontheweb
@Aaronontheweb: "Wenn der aktuelle Wert von Absender nicht in einer lokalen Variablen zwischengespeichert wird, die geschlossen wird, wenn Sie PipeTo verwenden". Das ergibt für mich keinen Sinn: Was PipeTo macht, ist nicht die Eigenschaft 'Sender', sondern eine lokale Variable (das Argument' recipient'), die eine Kopie des Verweises auf den aktuellen 'Sender' ist. Daher sehe ich das nicht anders als das explizite Kopieren der Eigenschaft 'Sender' in eine lokale Variable. –