我正在使用.NET存储客户端(2012年6月),我有一个类似以下的查询
(from e in tableContext.CreateQuery<Entity>(tableName)
select e).AsTableServiceQuery();
返回CloudTableQuery
类型,documented为:
“将类型
DataServiceQuery
的查询转换为处理延续令牌的CloudTableQuery
对象,并重试对Table服务的失败调用。”
我试图让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/EndExecuteSegmented
CloudTableQuery
Execute()
内部处理分页,就像同步等效{{1}}那样。
感谢。
答案 0 :(得分:1)
ExecuteSegmented仅返回单个结果段,其中包含实体和延续令牌。另一方面,Execute在内部处理continuation,并将遍历所有结果段。
但您是对的,Windows Azure存储客户端库中没有BeginExecute和EndExecute。原因很简单就是IEnumerable的定义。 IEnumerable本身不是异步的,因此,当需要获取下一个不同步的结果段时,实现必须阻塞调用者。