是否可以在 Akka.Net actor 计算中等待(不阻塞) Async ?我想实现类似于以下内容的目标。
actor {
let! msg = mailbox.Receive()
match msg with
| Foo ->
let! x = async.Return "testing 123" // Some async function, return just an example
() // Do something with result
}
不,你不能使用async
/ await
或其任何变体进入演员的邮箱并获得安全的结果。
每个参与者维护自己的上下文,其中包括重要的详细信息,例如上一条消息的发送者以及其他可能更改的重要状态部分。 Actor 连续处理消息,因此一旦其邮箱内的调用完成,它就会立即开始处理下一条消息 - 如果您在邮箱内放置一个等待调用,Actor 将处理一条与您开始处理的消息完全不同的消息。您的等待呼叫返回的时间。
利用异步调用和参与者内部 TAP 的更好模式是使用 PipeTo 模式。看起来我们还没有任何相关文档http://akkadotnet.github.io/ http://akkadotnet.github.io/,所以我将为您提供一个真实的代码示例(C# 语言):
public void Handle(ExplicitReplyOperation<CampaignsForAppRequest> message)
{
Context.IncrementMessagesReceived();
_loaderActor.Ask(message.Data).ContinueWith(r =>
{
var campaigns = (IList<Campaign>)r.Result;
message.Originator.Tell(new CampaignsForAppResponse()
{
AppId = message.Data.AppId,
ActiveCampaigns = campaigns
}, ActorRef.NoSender);
return campaigns;
}).PipeTo(Self);
}
在这个示例中我有一个TypedActor
继续一个任务,进行一些后处理,然后使用PipeTo
运算符(Akka.NET 扩展方法,您可以应用于任何Task
对象)以在操作完成后将任务结果通过管道传输到此参与者的邮箱中。这样我就可以关闭我需要的任何状态,并且我的参与者可以在异步操作继续的同时继续以安全的方式处理消息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)