我在一个项目中创建了两个actor Actor1和Actor2,并在Program.cs中注册了它们:
ActorRuntime.RegisterActorAsync<Actor1>();
ActorRuntime.RegisterActorAsync<Actor2>();
但在运行时我看到他们每个人都在不同的Actor Services中托管。当我通过Actor1中的StateManager在Reliable Collections中保存一些数据时,此状态不适用于Actor2。
是否可以在不同的演员类型之间共享状态?
答案 0 :(得分:2)
首先,看起来你是以错误的方式使用演员。您应该为每个主机进程注册一个actor类型。例如
ActorRuntime.RegisterActorAsync<Actor1>((context, actorType) =>
new ActorService(
context,
actorType,
() => new Actor1()))
.GetAwaiter()
.GetResult();
如果要在actor之间进行通信,则需要创建actor实例并在其接口上调用方法来保存数据。然后,如果要将相同数据保存在另一个actor中,则需要创建另一个实例。 设计的Actros是独特的,独立的实体。您可以从一个地方创建并创建两个actor并单独保存数据,或者您可以从第一个创建第二个actor。例如
var actor1Proxy = ActorProxy.Create<IActor1>(actorId, new Uri("fabric:/MyApp/Actor1"));
var actor2Proxy = ActorProxy.Create<IActor2>(actorId, new Uri("fabric:/MyApp/Actor2"));
actor1Proxy.SaveData(data);
actor2Proxy.SaveData(data);