0

私は .NET ストレージ クライアント (2012 年 6 月) を使用しており、次のようなクエリがあります。

(from e in tableContext.CreateQuery<Entity>(tableName)
 select e).AsTableServiceQuery();

CloudTableQueryこれはタイプを返し、次のように文書化されています。

「型のクエリを継続トークンを処理DataServiceQueryするCloudTableQueryオブジェクトに変換し、テーブル サービスへの失敗した呼び出しを再試行します。」</p>

私は CloudTableQuery を作成して、テーブル サービスの応答で "内部的に" ページネーションを処理できるようにしようとしました。Execute()メソッドはまさにこれを行い、さらに結果がある場合は継続トークンを処理します。

一方、同じ操作 ( BeginExecuteSegmented/EndExecuteSegmentedペア) に非同期メソッドを使用しようとすると、両方のオーバーロードがBeginExecuteSegmentedページネーションを内部的に処理しないことがわかりました (AsTableServiceQuery()ドキュメントで宣伝されているように)。

したがって、次のスニペットを書きました。

while (true){
    var ar = continuationToken == null ?
        entities.BeginExecuteSegmented(null, null)
        : entities.BeginExecuteSegmented(continuationToken, null, null);

    var task = Task.Factory.FromAsync(ar, r => entities.EndExecuteSegmented(r));
    var resultSegment = await task;
    results.AddRange(resultSegment.Results);
    if (resultSegment.HasMoreResults)
    {
        continuationToken = resultSegment.ContinuationToken;
    }
    else { break; }
}

これはページネーションを正常に処理しますが、同期のようにページネーションを内部的に処理しない理由を理解しようとしています。Begin/EndExecuteSegmentedCloudTableQueryExecute()

ありがとう。

4

1 に答える 1

1

ExecuteSegmented は、エンティティと継続トークンを含む単一の結果セグメントのみを返します。一方、実行は継続を内部的に処理し、すべての結果セグメントを反復します。

しかし、BeginExecute と EndExecute が Windows Azure ストレージ クライアント ライブラリにないことは間違いありません。その理由は、単純に IEnumerable の定義にあります。IEnumerable 自体は非同期ではないため、非同期ではない次の結果セグメントをフェッチする必要がある場合、実装は呼び出し元をブロックする必要があります。

于 2013-08-07T22:48:53.423 に答える