2017-02-28 138 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); 
    }