我应该如何等待 akka.net 中另一个演员的消息回复?

how i should wait for a message reply from another actor in akka.net?

我是 akka.net 的新手,我了解到要使用异步和等待模式,您必须使用 Ask() 方法,但据我所知,您只能等待一个仅当您在该 actor 或某个对象方法中触发一个方法时才执行任务,但是否可以等待向另一个 actor 发送消息的任务?

让我举个简单的例子来说明:

假设 ActorA 收到了一条消息,他需要来自 ActorB 的一些信息,ActorA 代码就像这样:

class ActorA :ReceiveActor
{
   public ActorA ()
   {
      Receive<string>(Message => ActorB.Ask<string>()); 
   }

}

假设我想暂停等待演员 B 的回复。我不想处理任何其他消息。 ActorB 监听请求,处理消息,然后最终回复。

当 ActorB 回复时,它必须以 ActorA.tell(replymessage) 的形式回复,这样 ActorA 可能永远无法处理回复,因为 replyMessage 应该发送到 ActorA 邮箱。

我是不是漏了什么!

如果您需要 request-response 在 Akka.NET 中发送消息,您可以使用 Ask 关键字和 ReceiveAsync:

class ActorA :ReceiveActor
{
   public ActorA ()
   {
      ReceiveAsync<string>(async message => {
        var resp = await ActorB.Ask<string>("some input");

        // do some work
      }); 
   }

}

这将使您的 actor 在继续之前异步等待直到收到响应 - 但值得注意的是,这将 阻止 您的 actor 在响应之前处理任何其他消息await 呼叫完成。

如果你想使用one-way消息传递来允许消息的交织,你也可以这样写:

class ActorA :ReceiveActor
{
   public ActorA ()
   {
      Receive<MessageType>(message => {
        // some work
        ActorB.Tell("some command");
      }); 

      Receive<string>(message => {
        // receive response from ActorB
      }); 
   }
}

不同之处在于,在第二个模型中没有超时或发件人处理消息并发送回复的验证。但是,它也需要更少的分配,并且允许 ActorA 在工作完成的同时继续在后台处理其他消息。

您可以使用任何一种方法 - 如果您绝对需要保证消息得到处理,我推荐第一种方法。