如果Actor a 在Actor b 和Actor c 上调用方法会发生什么?
Task<int> CallBAndC()
{
IActorB b = ActorProxy.Create<IActorB>(ActorId.CreateRandom(), new Uri("fabric://MyApp/MyService"));
IActorC c = ActorProxy.Create<IActorC>(ActorId.CreateRandom(), new Uri("fabric://MyApp/MyService"));
Task<int> futureBResult = b.Method();
Task<int> futureCResult = c.Method();
// do some lengthy computation
return (await futureBResult) + (await futureCResult);
}
'b.Method()'和'c.Method()'是否可以同时运行?还是它们按顺序运行(也许是由于位于Actor a 的调用上下文中)? 当'b.Method()'和'c.Method()'调用 a 方法时会发生什么?
答案 0 :(得分:1)
这种方法应该可以,请注意以下几点:
您应该始终等待actor调用返回的任务,如果您开除并忘记了您可能会丢失该调用,因为无法保证消息已传递。
当一个actor向另一个actor发送呼叫时,它将在队列中等待,直到该actor可以自由处理该呼叫。当调用来自同一上下文时,如果启用了Reentrancy,并且参与者正在等待同一上下文的操作完成,则将允许该调用继续。
示例:当演员A呼叫演员B,然后B尝试呼叫演员A,而A等待对B的初始调用完成,重入将允许B继续,然后返回从A到B的结果,然后B会将结果返回给A。可以更改此行为,当禁用重入模式时,当B尝试调用A时它将死锁。超时后操作将失败。