c# - 为什么我应该将 Sender 闭包与 PipeTo() 一起使用?

标签 c# akka akka.net

这是 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() 参数。

我错过了什么吗?

最佳答案

这里有两点需要理解:

  1. Sender 不是静态属性。 Sender is actually a function on the IActorContext返回正在处理的当前消息的发件人。每次上下文从邮箱中获取新消息时,返回的值都会发生变化。

  2. PipeTo 是一个延续,当该延续在线程池上执行时,调用 Sender 将访问完全相同的 IActorContext 对象那开始了任务。不能保证上下文中的当前 Sender 是相同的,因为自任务开始以来,新消息被推送到 actor 中进行处理。

所以我们将 Sender 的值缓存在一个局部变量中,以保证我们在 PipeTo 执行时将其指向正确的 IActorRef .

关于c# - 为什么我应该将 Sender 闭包与 PipeTo() 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31337157/

相关文章:

c# - WebBrowser Windows Phone 8 的自动高度

c# - 在运行时从外部配置文件重新加载配置设置

maven - GA 发布 Artifact akka-http 和 akka-streams 1.0 在哪里?

java - 一旦所有消息被消耗,关闭 akka-system

akka - 如何对 Actor 集合进行查询

F# 使用附加参数生成 Actor

actor - 将 Actor 模型与 RESTful API 相结合

c# - 如何验证 MVC 4 模型中的 IEnumerable<string> 属性

c# - SQLite.Interop unable to delete file on clean of 解决方法

Akka 故障恢复 : Gated State