我有一个Actor和一个Instantiate然后超过一次。当试图杀死指定的ActorRef时,我的所有演员都被杀死了。
示例:这是我的演员:
public class MyActor: ReceiveActor {
public MyActor() {
Receive<long>(id => Handler(id));
}
public void Handler(long id) {
Console.WriteLine(id)
}
}
我无法运行MyActor,每个都绑定Id
。
但是,当我试图杀死一个指定的演员时,它会杀死所有人。
示例:
所以,我试着在MyActor中使用这段代码:
public void Handler(long id) {
Console.WriteLine(id)
if (id == 3)
Self.Tell(Kill.Instance);
}
但是,它杀死了所有的MyActor。 怎么了?
- 编辑
public IActorRef ScheduleTellRepeatedly<T>(TimeSpan initialDelay, TimeSpan interval, object message) {
var actorRef = ActorSystem.ActorOf(ActorSystem.DI().Props(typeof(T)));
ActorSystem.ScheduleTellRepeatedly(initialDelay, interval, actorRef, message, ActorRefs.NoSender)
return actorRef;
}
var actor1 = ScheduleTellRepeatedly<MyActor>(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(30), 1);
var actor2 = ScheduleTellRepeatedly<MyActor>(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(30), 2);
var actor3 = ScheduleTellRepeatedly<MyActor>(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(30), 3);
var actor4 = ScheduleTellRepeatedly<MyActor>(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(30), 4);
var actor5 = ScheduleTellRepeatedly<MyActor>(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(30), 5);
actor3.Tell(Kill.Instance);
答案 0 :(得分:0)
如果没有看到实例化演员的代码,就很难确切地说出发生了什么。但是你的命令处理程序设置方式,我猜它是因为你只有一个演员旋转起来。只要它们都具有唯一的名称/引用,您就可以启动同一个actor的多个实例。以下代码将杀死其中一个actor,但保持其余的活动。
// Spin up five actors, each with a unique name/reference
// Fill in Props as needed
var actor1 = Context.ActorOf(MyActor.Props(), "MyActor_1");
var actor2 = Context.ActorOf(MyActor.Props(), "MyActor_2");
var actor3 = Context.ActorOf(MyActor.Props(), "MyActor_3");
var actor4 = Context.ActorOf(MyActor.Props(), "MyActor_4");
var actor5 = Context.ActorOf(MyActor.Props(), "MyActor_5");
// Kill the third actor by sending it a poison pill
actor3.Tell(PoisonPill.Instance);
// Send a message to any of the other actors
actor4.Tell((long)123); // Will write 123 to the console
注意:在上面的代码中,ActorOf
方法的第二个(可选)参数只是一个用户友好的名称,可以为您创建的actor提供。如果您选择不指定演员的姓名,Akka将自动为演员生成一个唯一的名称。
您的最新代码设置正确,只会杀死您指定的演员(actor3
)。我复制/粘贴了你的代码,运行它,并验证了其他四个演员仍在运行。我确实注意到您的MyActor
班级正在监听long
,但您传递的是int
。这可能会使其看起来好像其他演员在他们真的不关闭时被关闭。