【发布时间】:2017-05-21 02:48:20
【问题描述】:
据我所知,Akka.Net 中的所有操作都是异步的,Context.Stop() 只是向参与者发送一个Stop 消息。这意味着,actor 在完全关闭之前会存活一段时间。
如果我在Context.Stop() 之后用我刚刚停止的演员的名字打电话给Context.Child(),我会得到同一个演员。
这是示例代码
var actor = context.Child(actorName);
if (actor.Equals(ActorRefs.Nobody))
{
actor = CreateNewActor();
}
Context.Stop(actor)
actor = context.Child(actorName);
// what do we get here, same actor or ActorRefs.Nobody ?
我的应用程序创建参与者来处理来自终端的事件。每次连接新终端时,我都会通过使用终端名称调用 Context.Child() 创建新参与者。当终端断开连接时,我停止了演员。
问题是有时我在同一终端断开连接后立即收到连接消息,结果我得到将被停止的演员。有什么方法可以检查演员是否收到了停止消息并将很快停止?
【问题讨论】:
-
您应该阅读以下内容:* 生命周期监控又名 DeathWatch * 确认关闭:GracefulStop
-
我想到的一个命题也是FSM。之后,actor 收到 Disconnect 消息,您切换到新状态并更改行为。因此,Connect 消息不会被常规处理。您还可以定义当 Connect 消息未处理时 actor 应该做什么。