如何在創建時初始化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