Ecco the official sample di utilizzare PipeTo()
in Akka.NET:Perché dovrei usare la chiusura mittente con PipeTo()?
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);
});
La domanda è: perché dovremmo usare Sender
chiusura qui? Perché non usare solo:
In questo esempio e nei documenti si dice che è obbligatorio utilizzare la chiusura qui. Ma non vedo alcun motivo per farlo.
Se si utilizza ContinueWith()
è ragionevole utilizzare la chiusura all'interno della continuazione, ma non come parametro PipeTo()
.
Mi manca qualcosa?
Il problema che descrivi appare quando il compilatore acquisisce "questo" in un contesto di chiusura. Ad esempio, accade quando utilizziamo "questo" membri (come Sender) nelle espressioni lambda. Ma qui passiamo il parametro al metodo PipeTo() e non ci sono chiusure create. – alexey
Il mittente è un metodo sensibile al contesto: il suo valore si modifica ogni volta che un messaggio riceve un messaggio. Se il valore corrente di Sender non è memorizzato nella cache di una variabile locale, che viene chiusa quando si utilizza PipeTo, c'è una forte possibilità che la chiamata del mittente possa restituire un valore diverso dall'attore che ci si aspetta. Siamo stati in grado di replicare questo errore numerose volte: p – Aaronontheweb
@Aaronontheweb: "Se il valore corrente di Sender non è memorizzato nella cache in una variabile locale, che viene chiusa quando si utilizza PipeTo". Questo non ha senso per me: ciò che PipeTo fa non è la chiusura sulla proprietà 'Sender' ma su una variabile locale (l'argomento' recipient') che è una copia del riferimento al corrente 'Sender'. Pertanto non vedo questo come diverso dalla copia esplicita della proprietà 'Sender' su una variabile locale. –