Azure Storage クライアント ライブラリ 2.1 を使用して、テーブル ストレージの非同期クエリを作成しています。このコードを作成しました:
public async Task<List<TAzureTableEntity>> GetByPartitionKey(string partitionKey)
{
var theQuery = _table.CreateQuery<TAzureTableEntity>()
.Where(tEnt => tEnt.PartitionKey == partitionKey);
TableQuerySegment<TAzureTableEntity> querySegment = null;
var returnList = new List<TAzureTableEntity>();
while(querySegment == null || querySegment.ContinuationToken != null)
{
querySegment = await theQuery.AsTableQuery()
.ExecuteSegmentedAsync(querySegment != null ?
querySegment.ContinuationToken : null);
returnList.AddRange(querySegment);
}
return returnList;
}
大規模なデータ セットが戻ってくると仮定して、Table Storage へのラウンド トリップが多数発生するようにします。私が抱えている問題は、データのセットを待っていて、それをメモリ内リストに追加して、さらにデータを待って、同じリストに追加して、さらにデータを待って、リストに追加する...などです。など。Task.Factory.StartNew() を通常の TableQuery にラップしないのはなぜですか? そのようです:
public async Task<List<TAzureTableEntity>> GetByPartitionKey(string partitionKey)
{
var returnList = await Task.Factory.StartNew(() =>
table.CreateQuery<TAzureTableEntity>()
.Where(ent => ent.PartitionKey == partitionKey)
.ToList());
return returnList;
}
このようにすると、SynchronizationContext をあまり往復していないように見えます。それとも本当に重要ですか?
質問を言い換えて編集
上記の 2 つのシナリオの違いは何ですか?