如何杀死Akka.net中的一个Actor

时间:2018-06-04 12:49:16

标签: c# .net akka.net

我有一个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。
  • 与id绑定:[1,2,3,4,5]。
  • 我必须杀死身份为3的演员。

所以,我试着在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);

1 个答案:

答案 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。这可能会使其看起来好像其他演员在他们真的不关闭时被关闭。