多个参与者之间的并发
Concurrency among multiple actors
如果 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 的方法时会发生什么?
这种方法应该没问题,但要记住一些注意事项:
您应该始终等待 actor 调用 return 执行的任务,如果您触发并忘记了您可能会丢失调用,因为无法保证消息已送达。
当一个 actor 向另一个 actor 发送呼叫时,它将在队列中等待 actor 有空处理呼叫。当调用来自同一上下文时,如果启用 Reentrancy,并且参与者正在等待同一上下文的操作完成,则允许调用继续。
例子:当actor A调用actor B,然后B尝试调用actor A,而A等待对B的初始调用完成,重入将允许B继续,那么从A到B的结果是returned,然后 B 将 return 结果给 A。这种行为可以改变,当重入模式被禁用时,当 B 尝试调用 A 时它将死锁。超时后操作将失败.
如果 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 的方法时会发生什么?
这种方法应该没问题,但要记住一些注意事项:
您应该始终等待 actor 调用 return 执行的任务,如果您触发并忘记了您可能会丢失调用,因为无法保证消息已送达。
当一个 actor 向另一个 actor 发送呼叫时,它将在队列中等待 actor 有空处理呼叫。当调用来自同一上下文时,如果启用 Reentrancy,并且参与者正在等待同一上下文的操作完成,则允许调用继续。
例子:当actor A调用actor B,然后B尝试调用actor A,而A等待对B的初始调用完成,重入将允许B继续,那么从A到B的结果是returned,然后 B 将 return 结果给 A。这种行为可以改变,当重入模式被禁用时,当 B 尝试调用 A 时它将死锁。超时后操作将失败.