据我所知,Akka.Net 中的所有操作都是异步的,Context.Stop()
只是向 actor 发送一个 Stop
消息。这意味着,actor 在完全关闭之前会存活一段时间。
如果我在 Context.Stop()
之后用我刚刚停止的 Actor 的名字调用 Context.Child()
,我会得到相同的结果 Actor 。
这是示例代码
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()
来创建新的 actor。当终端断开连接时,我会停止 Actor 。
问题是,有时我会在同一终端的断开连接后立即收到连接消息,结果我得到的 Actor 将被停止。有什么方法可以检查 actor 是否收到了停止消息并将很快停止?
最佳答案
你可以使用
var shutdown = actor.GracefulStop(TimeSpan.FromSeconds(42));
它返回一个任务,其结果在 42 秒内确认关闭
更新
但是,以防万一,如果您想稍后使用相同的名称重新创建 actor,您应该在 actor 的主管中收听 Terminated 消息。
关于c# - 有没有办法等待 Actor 完全停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41504018/