这是 the official sample在 Akka.NET 中使用 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);
});
问题是为什么我们要在这里使用Sender
闭包?为什么不只使用:
_feedFactory.CreateFeedAsync(feed.FeedUri).PipeTo(Sender);
在此示例和文档中,据说必须在此处使用闭包。但我看不出有任何理由这样做。
如果我们使用了 ContinueWith()
,那么在延续中使用闭包是合理的,但不能作为 PipeTo()
参数。
我错过了什么吗?
最佳答案
这里有两点需要理解:
Sender
不是静态属性。Sender
is actually a function on theIActorContext
返回正在处理的当前消息的发件人。每次上下文从邮箱中获取新消息时,返回的值都会发生变化。PipeTo
是一个延续,当该延续在线程池上执行时,调用Sender
将访问完全相同的IActorContext
对象那开始了任务。不能保证上下文中的当前Sender
是相同的,因为自任务开始以来,新消息被推送到 actor 中进行处理。
所以我们将 Sender
的值缓存在一个局部变量中,以保证我们在 PipeTo
执行时将其指向正确的 IActorRef
.
关于c# - 为什么我应该将 Sender 闭包与 PipeTo() 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31337157/