在这种情况下:
Data Data;
public ParentActor(Data data)
{
Data = data;
Context.ActorOf(Props.Create(() => new ChildActor()))
}
在儿童演员中使用是一种好习惯:
(Context.Parent as ParentActor).Data; } }
或者这是违反阿克卡原则的吗?
或者正在以Data
的方式传递ChildActor
正确的方法?
它可能取决于Data
是否可变/不可变?
答案 0 :(得分:3)
这不仅仅是因为它不是一个好习惯,也不可能做到。 Context.Parent为您提供了一个ActorRef,它无法转换为ParentActor。 ActorRef只是一个向演员发送消息的引用,没有别的,它与演员的类没有任何关系。
无论如何,按照akka的原则,你不应该在演员之间分享可变的状态;你的演员的可变状态永远不会泄漏你的演员。如果您需要将状态的一部分发送给另一个actor,请确保它是不可变的,或者在发送消息之前创建一个不可变的副本。正如您所提到的,如果您的子actor经常使用它,您可以在构造函数上传递Data,但它必须是不可变的,否则,再次传递一个不可变的副本。
这背后的基本原理是任何两个参与者都可以在给定的时间点同时运行。如果两个参与者共享对可变对象的访问权限,他们可能会同时修改它,从任何一个角度来看都会导致竞争条件和非确定性行为。当然,您可以使用线程安全的数据结构,但这会破坏akka的整个目的,这样可以让您将消息处理视为在单个线程上运行。
答案 1 :(得分:1)
我自己是akka.net的新手,但是我对actor模型的理解表明你应该总是尝试尽可能通过消息传递数据,而不是通过方法调用或构造函数参数。