Das Actor-Framework unterscheidet nicht viel zwischen der Erstellung eines Actors beim ersten Mal und der Aktivierung eines Actors, der deaktiviert wurde und ruht. Beide Aktionen erstellen eine neue Instanz der Actor-Implementierung (Aufrufe .ctor) und rufen dann OnActivateAsync
auf. Es tut dies, bevor es eine Methode ausführt, die an den Actor gesendet wird. Es gibt keine Möglichkeit für Sie, eine Instanz eines Actors zu erstellen, ohne eine Methode auf der Schnittstelle des Actors aufzurufen. Es ist alles Teil der zugrunde liegenden ActorBase
und ActorManager
Behandlung von Nachrichten.
Auch slighlty je nach Art der Persistenz Sie für Ihre Schauspieler gewählt haben (None
, Volatile
oder Persisted
), der ActorService die Schauspieler Hosting speichert eine Persistenz Schlüssel mit dem IActorStateProvider
mit dem Schauspieler/ActorService verbunden. So "kennt" der ActorService auch seine Schauspieler. Wenn Sie eine ActorService über bekannte Schauspieler fragen, fragt er es StateProvider ist für
Wenn Sie einige Initialisierungscode das erste Mal ausgeführt werden soll, und nur das erste Mal, wenn ein Schauspieler aktiviert wird, dann könnte man einen Zustand Schlüssel für das hinzufügen Schauspieler in 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);
}
Was ich tun möchte, ist mein „initialisieren“ custom-Methode aufrufen, nachdem der Schauspieler mit ActorProxy zu schaffen. ich versuchte, es unter Verwendung Konstruktor Überlastung: 'public MyActor (ActorService service, ActorID id) : base (Service, id) { InitializeActor(); } ' aber es funktioniert nicht. So die einzige Möglichkeit, die "Initialize" -Methode nach der Actor-Erstellung ist von außerhalb des Schauspielers 'IMyActor myActor = ActorProxy.Create (" myActor "); myActor.InitializeActor(); ' oder mit der' OnActivateAsync'-Methode, richtig? –
Shkire
Der Aufruf vom Konstruktor sollte funktionieren. Aber der Konstruktor wird nur aufgerufen, wenn der Actor aktiviert ist. Und das geschieht, indem Sie eine Operation aufrufen. – LoekD