あなたのタスクに必要なものをシードするアクターにinitializeメソッドがあります。タイマーを設定し、initializeメソッドから戻ります。タイマーが起動すると、タイマーをシャットダウンし、ロジックを実行します。下の粗いサンプル。
public class SomeActor : Actor, ISomeActor
{
private IActorTimer _sendTimer;
protected override async Task OnActivateAsync()
{
await base.OnActivateAsync();
}
protected override async Task OnDeactivateAsync()
{
await this.ExecuteAgents();
await base.OnDeactivateAsync();
}
public Task Initialize()
{
if (_sendTimer == null)
{
//setup timer
_sendTimer = this.RegisterTimer((obj) =>
{
return this.Execute();
},
null,
TimeSpan.FromSeconds(1),
TimeSpan.FromSeconds(30));
}
}
private async Task ExecuteAgents()
{
this.UnegisterTimer(_sendTimer);
//Perform workload
}
}
初期化ではパラメータとして文字列が使用され、複数のアクタがこのアクタを呼び出すとします。その後、同じアクタに複数のコールを受信すると、各コールに対して複数のタイマーを追跡する必要がありますか? (私がこれを正しく理解している場合) –
それはあなたがしたい行動に依存します。 1つの方法は、無作為に生成されたIDを使用して、毎回新しいアクターインスタンスを取得することです(_sendTimerがヌルかどうかを確認して衝突をチェックする)。衝突を処理する代わりに、キューベースの実装を設定することもできます。衝突が発生した場合、特定のアクターインスタンスは、時間がたつと2つの作業を行うだけです。 –
SF図書のこの図は、多くを説明しています。 diff actorサービスのためにクライアントをスワップするだけです。 http://i.stack.imgur.com/PeuKY.png –