使用 Azure 存储客户端库 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;
}
让我们假设有大量数据返回,因此会有很多往返表存储。我遇到的问题是我们正在等待一组数据,将其添加到内存列表中,等待更多数据,将其添加到同一个列表中,等待更多数据,将其添加到列表中......等等等等。为什么不将 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 这么多。还是真的很重要?
编辑改写问题
上面提到的两种情况有什么区别?