簡體   English   中英

我應該如何等待來自 akka.net 中另一個參與者的消息回復?

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

我是 akka.net 的新手,我了解到為了使用 async 和 await 模式,您必須使用 Ask() 方法,但據我了解,只有在觸發方法時才能等待任務在那個演員或一些 object 方法中,但是否可以等待向另一個演員發送消息的任務?

讓我用一個簡單的例子來說明:

假設 ActorA 收到一條消息,他需要來自 ActorB 的一些信息,ActorA 代碼如下所示:

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

}

假設我想暫停等待演員 B 的回復。我不想處理任何其他消息。 ActorB 監聽請求,處理消息,然后最終回復。

問題是當 ActorB 回復時,它必須以 ActorA.tell(replymessage) 的形式回復,這樣 ActorA 可能永遠無法處理回復,因為 replyMessage 應該 go 到 ActorA 郵箱。

我錯過了什么嗎!

如果您需要 Akka.NET 中的請求-響應消息傳遞,您可以使用Ask關鍵字和ReceiveAsync

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

        // do some work
      }); 
   }

}

這將使您的演員異步等待,直到它收到響應后再繼續 - 但值得注意的是,這將阻止您的演員在await調用完成之前處理任何其他消息。

如果你想使用單向消息傳遞來允許消息交錯,你也可以這樣寫:

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

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

不同之處在於,在第二個 model 中,發送者處理了消息並發送了回復沒有超時或驗證。 但是,它也需要更少的分配,並且它允許ActorA在工作完成時繼續在后台處理其他消息。

您可以使用任何一種方法 - 如果您絕對需要保證消息得到處理,我建議您使用第一種方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM