1

シナリオ: ステートフル SF サービスは、その状態をいくつかの信頼できるコレクションに格納します。ステートフル SF はリモーティング経由で利用できます。

コレクションを最初に使用する前に (StateManager.GetOrAddAsync を呼び出して) 「初期化」する必要がありますか? 信頼できるコレクションへの最初のアクセスを減らすのに役立ちますか、それともこの手順を実行する必要はありませんか?

この初期化を行うように勧められている場合、いつ、どこで行うのが適切ですか? 最も合理的な場所は RunAsync の無限ループの直前ですが、コレクションが初期化される前にリモート処理を介して呼び出されるメソッドが呼び出される場合はどうでしょうか? その最初のリモート呼び出し (コレクションが初期化されるとき) でパフォーマンスが低下することはありますか?

最後に->信頼できるコレクションを操作する場合、クラス内のコレクションへの参照を保持しても問題ありません(たとえば、インスタンスの開始中にStateManager.GetOrAddAsyncを使用して参照を取得します)。この参照のみで操作するか、StateManager.GetOrAddAsyncを呼び出す方がよいコレクションへのすべての呼び出しの前に?

答えてくれてありがとう!

4

1 に答える 1

0

コレクションを最初に使用する前に (StateManager.GetOrAddAsync を呼び出して) 「初期化」する必要がありますか?

はい。ただし、収集を「ウォームアップ」するためにそれを行う必要はありません。本当にデータを取得する必要がある場合、または何かを保存したい場合は、そのメソッドを呼び出します。

コレクションが初期化される前に、リモーティング経由で呼び出されたメソッドが呼び出されるとどうなりますか?

StateManager.GetOrAddAsyncそのため、サービスを呼び出すたびに行う必要があります。

その最初のリモート呼び出しでパフォーマンスが低下することはありますか?

はい。でも目立たなくなる。

信頼できるコレクションを操作する場合、クラスでコレクションへの参照を保持しても問題ありません

メソッド呼び出し内の変数にコレクションへの参照を保持できます。次に例を示します。

    public async Task AddPost(Guid userId, PostId postId)
    {
        try
        {
            var state = await StateManager.GetOrAddAsync<IReliableDictionary<Guid, List<PostId>>>(StateName);

            using (var tx = StateManager.CreateTransaction())
            {
                await state.AddOrUpdateAsync(
                    tx,
                    userId,
                    addValue: new List<PostId> {postId},
                    updateValueFactory: (usrId, oldPostsList) =>
                    {
                        oldPostsList.Insert(0, postId);
                        return oldPostsList;
                    }
                );

                await tx.CommitAsync();
            }
        }
        catch (TimeoutException)
        {
            PostsLogger.Singleton.LogWarning("Add post timeout");
            throw;
        }
        catch (Exception ex)
        {
            PostsLogger.Singleton.LogException(sb.ToString(), ex);
            throw;
        }
    }
于 2016-12-06T09:07:34.803 に答える