[英]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.