2015-07-10 24 views
5

İşte Akka.NET içinde PipeTo() kullanmanın the official sample var:Neden Göndericinin kapatılmasını PipeTo() ile kullanmalıyım?

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); 
}); 

biz burada Sender kapatılması kullanmalısınız neden soru nedir? Bu örnekte

_feedFactory.CreateFeedAsync(feed.FeedUri).PipeTo(Sender); 

ve söylenir docs burada kapatma kullanmak zorunludur: Neden sadece kullanmak değil. Ama bunun için hiçbir neden göremiyorum.

ContinueWith() kullansaydık, kapamanın kullanılmasının makul olduğu ancak PipeTo() parametresi olarak kullanılması makul olur.

Bir şey özlüyor muyum?

cevap

5

Burada iki nokta anlamak:

  1. Sender statik özellik değildir. Sender is actually a function on the IActorContext, işlenmekte olan mevcut iletinin göndericisini döndürür. Bağlam, içerik her zaman posta kutusundan yeni bir mesaj aldığında değişir.

  2. PipeTo

    devamıdır, ve bu devam parçacığı üzerinde yürütüldüğünde, Sender arama görevi başlatan aynı IActorContext nesne erişir. Yeni mesaj (lar) görev başladığından beri işlem yapmak için aktöre aktarıldığından, geçerli Sender'un bağlamda aynı olduğuna dair bir garanti yoktur.

yüzden o yürütür zaman biz doğru IActorRef de PipeTo hedefliyoruz garanti için yerel değişkende Sender değerini önbelleğe.

+1

Tanımladığınız sorun, derleyici bir kapatma bağlamında "bunu" yakaladığında görünür. Örneğin, lambda ifadelerinde "bu" üyeleri (Gönderen gibi) kullandığımızda olur. Fakat burada sadece PipeTo() yöntemine parametreyi aktarıyoruz ve hiçbir kapanma oluşmuyor. – alexey

+3

Gönderen, içeriğe duyarlı bir yöntemdir - bir oyuncu tarafından bir iletinin her alınışında değerin değişmesidir. Gönderenin geçerli değeri yerel bir değişkende önbelleğe alınmazsa, PipeTo kullandığınızda kapanırsa, gönderen çağrısının beklediğiniz oyuncudan farklı bir değer döndürmesi olasılığı vardır. Bu hatayı birçok kez kopyalayabildik: p – Aaronontheweb

+0

@Aaronontheweb: "Gönderenin geçerli değeri, PipeTo kullanıldığında kapalı olan yerel bir değişkende önbelleğe alınmadıysa". Bu bana mantıklı gelmiyor: PipeTo'nun yaptığı, "Gönderen" özelliğinde değil, geçerli "Gönderenin" referansının bir kopyası olan yerel bir değişkende (alıcı "argümanı") kapanıyor. Bu nedenle, "Gönderen" özelliğini yerel bir değişkene açıkça kopyalamaktan farklı olarak görmüyorum. –

İlgili konular