使用Azure存储客户端库2.1,我正在查询表存储异步。我创造了这个代码:如何使用Table.ExecuteQuerySegmentedAsync()与Azure表存储
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;
}
让我们假设有一个大的数据集回来所以会有很多往返表存储的。我遇到的问题是我们正在等待一组数据,将它添加到内存列表中,等待更多数据,将它添加到同一个列表中,等待更多数据,将它添加到列表中...等等等等。为什么不只是围绕常规TableQuery包装Task.Factory.StartNew()?像这样:
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来回这么多。还是它真的很重要?
编辑来修改你的问题
什么是上面提到的两种情况之间的差异?
你把你的“片段”在它自己的异步方法和使用调用它ConfigureAwait(假)。 –
@PauloMorgado - 具有讽刺意味的是,实际上我已经在单独的方法中使用了TableQuerySegement和while语句,但是我不知道Task上的ConfigureAwait(false)方法。谢谢你的提示! – Hallmanac
对于所有库代码,建议使用ConfigureAwait(false),并将其扩展到所有非UI应用程序代码。 –