我应该如何等待 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
在工作完成的同时继续在后台处理其他消息。
您可以使用任何一种方法 - 如果您绝对需要保证消息得到处理,我推荐第一种方法。
我是 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
在工作完成的同时继续在后台处理其他消息。
您可以使用任何一种方法 - 如果您绝对需要保证消息得到处理,我推荐第一种方法。