2017-02-28 142 views
1

如何在创建时初始化Azure服务结构演员?Azure服务结构演员初始化

我试着用初始化方法重载actor构造函数,但它没有奏效。

在创建actor之后,我必须从客户端调用初始化方法,还是有办法在创建时让actor自动初始化automaticaly?

回答

1

当你调用一个方法时,首先创建一个Actor。因此,如果您需要初始化尚不存在的Actor,则需要确保它首先活跃起来。它本身无法做到这一点。

您可以创建一个方法来初始化Actor并使其成为Actor的接口的一部分。

您也可以使用OnActivateAsync方法,该方法将触发每次激活。

了解更多关于演员生命周期here

+0

我想要做的就是创建一个使用ActorProxy演员后打电话给我“初始化”自定义方法。 我尝试了使用构造函数重载: '公共MyActor(ActorService服务,actorId来ID) :基座(服务,ID) { InitializeActor(); }' 但它不起作用。 因此,演员创建后调用“初始化”方法的唯一方式是从演员外部调用IMyActor myActor = ActorProxy.Create (“myActor”); myActor.InitializeActor();' 或使用'OnActivateAsync'方法,对吧? – Shkire

+0

从构造函数调用它应该工作。但是你的构造函数被调用的唯一方法是当Actor被激活时。这发生在调用一个操作。 – LoekD

0

Actor框架在第一次创建Actor和激活已停用且处于休眠状态的Actor之间没有很大区别。这两个操作都将创建一个Actor实现的新实例(调用.ctor),然后调用OnActivateAsync。它在执行派发给Actor的任何方法之前执行此操作。没有办法在没有调用Actor接口的方法的情况下创建Actor的实例,它是基本的ActorBaseActorManager处理消息的一部分。

此外,slighlty取决于你选择你的演员(NoneVolatilePersisted)持久性的类型,托管演员的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); 
    }