2017-02-28 2 views
1

作成時にAzureサービスファブリックアクタを初期化するにはどうすればよいですか?Azureサービスファブリックアクターの初期化

アクターコンストラクタを初期化メソッドでオーバーロードしようとしましたが、動作しませんでした。

アクタを作成した後にクライアントから初期化メソッドを呼び出す必要がありますか、作成中にアクタを自動的に初期化する方法がありますか?

答えて

1

アクタは、メソッドを呼び出すと、最初に作成されます。したがって、まだ存在しないActorを初期化する必要がある場合は、まずそれが生きていることを確認する必要があります。それだけではできません。

アクタを初期化し、アクタのインターフェイスの一部にするメソッドを作成できます。

OnActivateAsyncメソッドを使用して、すべてのアクティブ化をトリガーすることもできます。

俳優のライフサイクルhereについて詳しくは、こちらをご覧ください。

+0

私は何をしたいActorProxyを使用して俳優を作成した後に、私の「初期化」のカスタムメソッドを呼び出すことです。 '公共MyActor(ActorServiceサービス、アクターID番号) : 私は、コンストラクタのオーバーロードを使用して、それを試してみましたベース(サービスID) {InitializeActorを(); } ' が動作しません。 アクターの作成後に「初期化」メソッドを呼び出す唯一の方法は、アクターの外からです IMyActor myActor = ActorProxy.Create ( "myActor"); myActor.InitializeActor(); ' または' OnActivateAsync'メソッドを使用しています。 – Shkire

+0

コンストラクタから呼び出すとうまくいくはずです。しかし、コンストラクタが呼び出される唯一の方法は、アクタがアクティブになっている場合です。それはその上で操作を呼び出すことによって起こります。 – LoekD

0

アクタフレームワークは、初めてアクタを作成することと、非アクティブ化されて休止状態にあるアクタを起動することとを区別しません。どちらのアクションでも、Actor実装の新しいインスタンス(.ctor)が作成され、OnActivateAsyncが呼び出されます。これは、アクターにディスパッチされたメソッドを実行する前にこれを行います。 Actorのインターフェイス上でメソッドを呼び出さずにActorのインスタンスを作成する方法はありません。そのすべては、基礎となるActorBaseActorManagerのメッセージ処理の一部です。 slighltyあなたが俳優(NoneVolatileまたは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); 
    } 
関連する問題