如何在创建时初始化Azure服务结构演员?Azure服务结构演员初始化
我试着用初始化方法重载actor构造函数,但它没有奏效。
在创建actor之后,我必须从客户端调用初始化方法,还是有办法在创建时让actor自动初始化automaticaly?
如何在创建时初始化Azure服务结构演员?Azure服务结构演员初始化
我试着用初始化方法重载actor构造函数,但它没有奏效。
在创建actor之后,我必须从客户端调用初始化方法,还是有办法在创建时让actor自动初始化automaticaly?
当你调用一个方法时,首先创建一个Actor。因此,如果您需要初始化尚不存在的Actor,则需要确保它首先活跃起来。它本身无法做到这一点。
您可以创建一个方法来初始化Actor并使其成为Actor的接口的一部分。
您也可以使用OnActivateAsync
方法,该方法将触发每次激活。
了解更多关于演员生命周期here。
Actor框架在第一次创建Actor和激活已停用且处于休眠状态的Actor之间没有很大区别。这两个操作都将创建一个Actor实现的新实例(调用.ctor),然后调用OnActivateAsync
。它在执行派发给Actor的任何方法之前执行此操作。没有办法在没有调用Actor接口的方法的情况下创建Actor的实例,它是基本的ActorBase
和ActorManager
处理消息的一部分。
此外,slighlty取决于你选择你的演员(None
,Volatile
或Persisted
)持久性的类型,托管演员的ActorService存储与该演员/ ActorService相关的IActorStateProvider
持久的关键。这就是ActorService“知道”它的演员的方式。当你问一个ActorService大约知名演员,它查询它的StateProvider为
如果你想运行一些初始化代码首次,只有第一次的演员被激活,那么你可以添加一个国家重点针对演员在OnActivateAsync
:
protected override async Task OnActivateAsync()
{
ActorEventSource.Current.ActorMessage(this, "Actor activated.");
var initialized = await this.StateManager.ContainsStateAsync("initalized");
if (!initialized) await Initialize();
}
private async Task Initialize()
{
ActorEventSource.Current.ActorMessage(this, "Actor initialized.");
await this.StateManager.AddStateAsync("initialized", true);
}
我想要做的就是创建一个使用ActorProxy演员后打电话给我“初始化”自定义方法。 我尝试了使用构造函数重载: '公共MyActor(ActorService服务,actorId来ID) :基座(服务,ID) { InitializeActor(); }' 但它不起作用。 因此,演员创建后调用“初始化”方法的唯一方式是从演员外部调用IMyActor myActor = ActorProxy.Create(“myActor”); myActor.InitializeActor();' 或使用'OnActivateAsync'方法,对吧? –
Shkire
从构造函数调用它应该工作。但是你的构造函数被调用的唯一方法是当Actor被激活时。这发生在调用一个操作。 – LoekD