Akka. Net переключение поведения с помощью Become () - PullRequest
0 голосов
/ 31 января 2020

Я построен как простой актер, который принимает два сообщения: TicketValidated и BarrierPu sh, но переключение происходит не так, как предполагалось.

 public class TurnstileActor : ReceiveActor
{
    public TurnstileActor()
    {
        Become(Locked); 
    }
    public void Locked()
    {
        Receive<TicketValidated>(msg => Become(Unlocked));
        Receive<BarrierPush>(msg => { Console.WriteLine("Locked");});
    }

    public void Unlocked()
    {
        Receive<TicketValidated>(msg => 
            Console.WriteLine("Unlocked"));
        Receive<BarrierPush>(msg => Become(Locked));
    }
}

Основной класс

var system = ActorSystem.Create("ActorSystem");
var actor = system.ActorOf<TurnstileActor>("actor");

actor.Tell(new TicketValidated());

Фактическое выполнение: метод Locked () вызывается из конструктора и принимается сообщение TicketValidated . Become (Unlocked) выполняется правильно и входит в метод Unlocked () , но затем Console.WriteLine ("Unlocked") не вызывается.

Не нарушена ли библиотека Akka. Net?

1 Ответ

0 голосов
/ 07 марта 2020

Чтобы понять это поведение, рассмотрим, что происходит, когда выполняется Become (Unlocked), и он входит в метод Unlocked (). Метод Unlocked, в свою очередь, дважды вызывает метод Receive: эти два вызова функции Receive регистрируют новое поведение этого субъекта, влияя на последующие сообщения, отправленные этому экземпляру субъекта. Лямбды, передаваемые в методы Receive, в настоящее время не выполняются - они представляют новое зарегистрированное поведение, которое будет видно при получении последующих сообщений.

Это объясняет, почему «Unlocked» не записывается в консоль при выполнении «Становится (разблокировано)» - это будет видно только в том случае, если полученное сообщение next является другим «TicketValidated».

...